feat(FN-2552): distinguish workflow failed dots in task progress

- Add a workflow-failed dot modifier class for failed workflow checks in TaskCard
- Apply ws-warning styling to workflow-origin failed steps while keeping regular failed steps unchanged
- Update TaskCard rendering logic to append the workflow-failed class only for workflow failed items
- Expand TaskCard tests to verify class assignment for regular failed, workflow failed, done, and pending dots
This commit is contained in:
Fusion
2026-04-25 15:44:24 -07:00
committed by gsxdsm
parent f589359e83
commit d028b41164
3 changed files with 34 additions and 18 deletions

View File

@@ -568,6 +568,10 @@
background: var(--color-error-dark);
}
.card-step-dot--workflow-failed {
background: var(--ws-warning);
}
.card-step-name {
flex: 1;
min-width: 0;

View File

@@ -1222,25 +1222,29 @@ function TaskCardComponent({
</button>
{showSteps && (
<div className="card-steps-list">
{unifiedProgress.items.map((step) => (
<div key={step.id} className="card-step-item">
<span
className={`card-step-dot card-step-dot--${step.status}`}
aria-hidden="true"
/>
<span className={`card-step-name${step.status === "done" ? " completed" : ""}`}>
{step.name}
</span>
{step.source === "workflow" && (
{unifiedProgress.items.map((step) => {
const isWorkflowFailed = step.source === "workflow" && step.status === "failed";
return (
<div key={step.id} className="card-step-item">
<span
className={`card-step-workflow-badge card-step-workflow-badge--${step.phase}`}
title="Workflow check"
>
workflow
className={`card-step-dot card-step-dot--${step.status}${isWorkflowFailed ? " card-step-dot--workflow-failed" : ""}`}
aria-hidden="true"
/>
<span className={`card-step-name${step.status === "done" ? " completed" : ""}`}>
{step.name}
</span>
)}
</div>
))}
{step.source === "workflow" && (
<span
className={`card-step-workflow-badge card-step-workflow-badge--${step.phase}`}
title="Workflow check"
>
workflow
</span>
)}
</div>
);
})}
</div>
)}
</>

View File

@@ -167,7 +167,7 @@ describe("TaskCard", () => {
task={makeTask({
steps: [
{ name: "Step 0", status: "done" },
{ name: "Step 1", status: "pending" },
{ name: "Step 1", status: "failed" },
],
enabledWorkflowSteps: ["WS-001", "WS-002", "WS-003"],
workflowStepResults: [
@@ -200,9 +200,17 @@ describe("TaskCard", () => {
]);
const dots = container.querySelectorAll(".card-step-dot");
expect(dots[1]?.className).toContain("card-step-dot--failed");
expect(dots[1]?.className).not.toContain("card-step-dot--workflow-failed");
expect(dots[2]?.className).toContain("card-step-dot--done");
expect(dots[2]?.className).not.toContain("card-step-dot--workflow-failed");
expect(dots[3]?.className).toContain("card-step-dot--failed");
expect(dots[3]?.className).toContain("card-step-dot--workflow-failed");
expect(dots[4]?.className).toContain("card-step-dot--pending");
expect(dots[4]?.className).not.toContain("card-step-dot--workflow-failed");
const workflowBadgeElements = container.querySelectorAll(".card-step-workflow-badge");
const workflowBadges = Array.from(workflowBadgeElements).map((el) => el.textContent);