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:
@@ -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"
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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([
|
||||
|
||||
Reference in New Issue
Block a user