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

- feat(FN-2913): complete Step 7 — align InlineCreateCard node picker UX

Fusion-Task-Id: FN-2913
This commit is contained in:
Fusion
2026-04-29 00:08:21 -07:00
committed by gsxdsm
parent 5ef5efd7cd
commit d44b688260
7 changed files with 435 additions and 60 deletions

View File

@@ -22,6 +22,7 @@ vi.mock("lucide-react", () => ({
ChevronDown: () => null,
ChevronUp: () => null,
Bot: () => null,
Server: () => null,
Maximize2: () => null,
Minimize2: () => null,
}));
@@ -1398,19 +1399,68 @@ describe("InlineCreateCard button visibility when collapsed", () => {
describe("InlineCreateCard node override", () => {
it("opens node picker from button", () => {
renderCard();
expandCard();
fireEvent.click(screen.getByTestId("inline-create-node-button"));
expect(screen.getByText("Select execution node")).toBeInTheDocument();
});
it("closes node picker on outside click", () => {
renderCard();
expandCard();
fireEvent.click(screen.getByTestId("inline-create-node-button"));
expect(screen.getByText("Select execution node")).toBeInTheDocument();
fireEvent.mouseDown(document.body);
expect(screen.queryByText("Select execution node")).not.toBeInTheDocument();
});
it("includes nodeId in payload when execution node override is selected", async () => {
const onSubmit = vi.fn().mockResolvedValue({ id: "FN-777" } as Task);
renderCard([], { onSubmit });
fireEvent.change(screen.getByPlaceholderText("What needs to be done?"), { target: { value: "Run on node" } });
expandCard();
fireEvent.change(screen.getByTestId("inline-create-node-select"), { target: { value: "node-1" } });
fireEvent.click(screen.getByTestId("inline-create-node-button"));
fireEvent.click(screen.getByRole("button", { name: /Node One/i }));
fireEvent.click(screen.getByTestId("save-button"));
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledWith(expect.objectContaining({ nodeId: "node-1" }));
});
});
it("clears node override when project default is selected", async () => {
const onSubmit = vi.fn().mockResolvedValue({ id: "FN-778" } as Task);
renderCard([], { onSubmit });
fireEvent.change(screen.getByPlaceholderText("What needs to be done?"), { target: { value: "Run locally" } });
expandCard();
fireEvent.click(screen.getByTestId("inline-create-node-button"));
fireEvent.click(screen.getByRole("button", { name: /Node Two/i }));
fireEvent.click(screen.getByTestId("inline-create-node-button"));
fireEvent.click(screen.getByRole("button", { name: /Project default \/ local/i }));
fireEvent.click(screen.getByTestId("save-button"));
await waitFor(() => {
expect(onSubmit).toHaveBeenCalledWith(expect.objectContaining({ nodeId: undefined }));
});
});
it("shows selected node name on the node button", () => {
renderCard();
expandCard();
fireEvent.click(screen.getByTestId("inline-create-node-button"));
fireEvent.click(screen.getByRole("button", { name: /Node Two/i }));
expect(screen.getByTestId("inline-create-node-button")).toHaveTextContent("Node Two");
});
});
});