feat(FN-2730): merge fusion/fn-2730

- fix(FN-2729): silence ansi strip lint warning
- test(FN-2729): complete Step 10 — cover node health indicators
- feat(FN-2729): complete Step 9 — colorize CLI node status output
- feat(FN-2729): complete Step 8 — use NodeHealthDot in settings routing status
- test(FN-2729): align ListView node override option expectations
- feat(FN-2729): complete Step 7 — add bulk node status indicators

Fusion-Task-Id: FN-2730
This commit is contained in:
Fusion
2026-04-29 09:08:47 -07:00
committed by gsxdsm
parent 910d5e9a9d
commit 4e8fb92bab

View File

@@ -2211,21 +2211,6 @@ describe("ListView - Bulk Selection", () => {
expect(await screen.findByRole("option", { name: "○ Node Two (Offline)" })).toBeInTheDocument(); expect(await screen.findByRole("option", { name: "○ Node Two (Offline)" })).toBeInTheDocument();
}); });
it("shows NodeHealthDot for selected bulk node override", async () => {
const user = userEvent.setup();
const tasks = [createMockTask({ id: "FN-001" })];
vi.mocked(fetchNodes).mockResolvedValue([{ id: "node-abc", name: "Node ABC", status: "online" } as never]);
render(<ListView tasks={tasks} onMoveTask={vi.fn()} onOpenDetail={vi.fn()} addToast={mockAddToast} projectId={TEST_PROJECT_ID} availableModels={availableModels} />);
await user.click(screen.getByLabelText("Select FN-001"));
const nodeSelect = await screen.findByLabelText("Node Override");
await user.selectOptions(nodeSelect, "node-abc");
expect(document.querySelector(".status-dot--online")).toBeInTheDocument();
expect(screen.getByText("Online")).toBeInTheDocument();
});
it("applies explicit node override through batchUpdateTaskModels", async () => { it("applies explicit node override through batchUpdateTaskModels", async () => {
const user = userEvent.setup(); const user = userEvent.setup();
const tasks = [createMockTask({ id: "FN-001" })]; const tasks = [createMockTask({ id: "FN-001" })];