fix(FN-1102): persist workflow step selection in task create payloads

- Add browser verification toggle state to InlineCreateCard and submit browser-verification via enabledWorkflowSteps when selected
- Reset browser verification state after submit/cancel flows to prevent stale workflow selections
- Add InlineCreateCard and NewTaskModal tests that verify enabledWorkflowSteps are included in create payloads
- Add a patch changeset for @gsxdsm/fusion describing the workflow-step visibility fix
This commit is contained in:
gsxdsm
2026-04-07 23:26:28 -07:00
parent ed84a728c2
commit f0637af40c
4 changed files with 70 additions and 1 deletions

View File

@@ -85,6 +85,7 @@ export function InlineCreateCard({
const [executorModelId, setExecutorModelId] = useState<string | undefined>(undefined);
const [validatorProvider, setValidatorProvider] = useState<string | undefined>(undefined);
const [validatorModelId, setValidatorModelId] = useState<string | undefined>(undefined);
const [browserVerification, setBrowserVerification] = useState(false);
const [modelsLoading, setModelsLoading] = useState(false);
const [modelsError, setModelsError] = useState<string | null>(null);
const [loadedModels, setLoadedModels] = useState<ModelInfo[]>(availableModels ?? []);
@@ -281,7 +282,7 @@ export function InlineCreateCard({
modelId: hasExecutorOverride ? executorModelId : undefined,
validatorModelProvider: hasValidatorOverride ? validatorProvider : undefined,
validatorModelId: hasValidatorOverride ? validatorModelId : undefined,
enabledWorkflowSteps: undefined,
enabledWorkflowSteps: browserVerification ? ["browser-verification"] : undefined,
});
// Upload pending images as attachments
@@ -312,6 +313,7 @@ export function InlineCreateCard({
setExecutorModelId(undefined);
setValidatorProvider(undefined);
setValidatorModelId(undefined);
setBrowserVerification(false);
setDependencies([]);
setShowDeps(false);
setIsModelModalOpen(false);
@@ -338,6 +340,7 @@ export function InlineCreateCard({
hasValidatorOverride,
validatorProvider,
validatorModelId,
browserVerification,
submitting,
pendingImages,
onSubmit,
@@ -471,6 +474,7 @@ export function InlineCreateCard({
setExecutorModelId(undefined);
setValidatorProvider(undefined);
setValidatorModelId(undefined);
setBrowserVerification(false);
setSelectedPresetId(undefined);
setShowDeps(false);
setIsModelModalOpen(false);
@@ -492,6 +496,7 @@ export function InlineCreateCard({
setExecutorModelId(undefined);
setValidatorProvider(undefined);
setValidatorModelId(undefined);
setBrowserVerification(false);
setSelectedPresetId(undefined);
setShowDeps(false);
setIsModelModalOpen(false);
@@ -642,6 +647,17 @@ export function InlineCreateCard({
})()}
</div>
<button
type="button"
className="btn btn-sm"
data-testid="inline-create-browser-verification-toggle"
aria-pressed={browserVerification}
onClick={() => setBrowserVerification((prev) => !prev)}
title="Enable browser verification workflow step"
>
{browserVerification ? "Browser Verify ✓" : "Browser Verify"}
</button>
<div className="inline-create-model-wrap">
<button
type="button"

View File

@@ -828,6 +828,27 @@ describe("InlineCreateCard button visibility when collapsed", () => {
});
});
it("submits browser-verification workflow step when browser verification is enabled", async () => {
const mockOnSubmit = vi.fn().mockResolvedValue(createMockTask());
renderCard([], { onSubmit: mockOnSubmit });
expandCard();
fireEvent.change(screen.getByPlaceholderText("What needs to be done?"), {
target: { value: "Verify login flow in browser" },
});
fireEvent.click(screen.getByTestId("inline-create-browser-verification-toggle"));
fireEvent.click(screen.getByTestId("save-button"));
await waitFor(() => {
expect(mockOnSubmit).toHaveBeenCalledWith(
expect.objectContaining({
enabledWorkflowSteps: ["browser-verification"],
}),
);
});
});
describe("Description-adjacent actions layout (FN-781)", () => {
it("renders Plan and Subtask in description-actions area when expanded", () => {
renderCard();

View File

@@ -350,6 +350,33 @@ describe("NewTaskModal", () => {
// Workflow step ordering tests (FN-836)
describe("workflow step ordering", () => {
it("sends selected enabledWorkflowSteps in create payload", async () => {
const { fetchWorkflowSteps } = await import("../../api");
vi.mocked(fetchWorkflowSteps).mockResolvedValueOnce([
{ id: "WS-001", name: "QA Check", description: "Run tests", prompt: "Check tests", enabled: true, createdAt: "", updatedAt: "" },
]);
const { props } = renderNewTaskModal();
await waitFor(() => {
expect(screen.getByTestId("workflow-step-checkbox-WS-001")).toBeTruthy();
});
const checkbox = screen.getByTestId("workflow-step-checkbox-WS-001").querySelector('input[type="checkbox"]') as HTMLInputElement;
fireEvent.click(checkbox);
fireEvent.change(screen.getByLabelText(/Description/i), { target: { value: "Task with workflow step" } });
fireEvent.click(screen.getByRole("button", { name: "Create Task" }));
await waitFor(() => {
expect(props.onCreateTask).toHaveBeenCalledWith(
expect.objectContaining({
enabledWorkflowSteps: ["WS-001"],
}),
);
});
});
it("sends ordered enabledWorkflowSteps in create payload when steps are selected in order", async () => {
const { fetchWorkflowSteps } = await import("../../api");
vi.mocked(fetchWorkflowSteps).mockResolvedValueOnce([