From ca84e576655326705455280070ba49eebe5fe9bf Mon Sep 17 00:00:00 2001 From: Jonathan Dobson Date: Tue, 16 Sep 2025 09:03:30 -0400 Subject: [PATCH] enable code view for taskv2 block (#3443) --- .../editor/nodes/Taskv2Node/Taskv2Node.tsx | 296 +++++++++--------- .../routes/workflows/types/workflowTypes.ts | 1 + 2 files changed, 157 insertions(+), 140 deletions(-) diff --git a/skyvern-frontend/src/routes/workflows/editor/nodes/Taskv2Node/Taskv2Node.tsx b/skyvern-frontend/src/routes/workflows/editor/nodes/Taskv2Node/Taskv2Node.tsx index 12d0316c..79b62355 100644 --- a/skyvern-frontend/src/routes/workflows/editor/nodes/Taskv2Node/Taskv2Node.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/nodes/Taskv2Node/Taskv2Node.tsx @@ -1,3 +1,5 @@ +import { useEffect, useState } from "react"; +import { Flippable } from "@/components/Flippable"; import { HelpTooltip } from "@/components/HelpTooltip"; import { WorkflowBlockInputTextarea } from "@/components/WorkflowBlockInputTextarea"; import { @@ -10,7 +12,6 @@ import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Separator } from "@/components/ui/separator"; import { Handle, NodeProps, Position, useReactFlow } from "@xyflow/react"; -import { useState } from "react"; import { helpTooltips, placeholders } from "../../helpContent"; import { useIsFirstBlockInWorkflow } from "../../hooks/useIsFirstNodeInWorkflow"; import { MAX_STEPS_DEFAULT, type Taskv2Node } from "./types"; @@ -22,6 +23,8 @@ import { useParams } from "react-router-dom"; import { statusIsRunningOrQueued } from "@/routes/tasks/types"; import { useWorkflowRunQuery } from "@/routes/workflows/hooks/useWorkflowRunQuery"; import { useRerender } from "@/hooks/useRerender"; +import { BlockCodeEditor } from "@/routes/workflows/components/BlockCodeEditor"; +import { useBlockScriptStore } from "@/store/BlockScriptStore"; function Taskv2Node({ id, data, type }: NodeProps) { const { editable, label } = data; @@ -34,6 +37,9 @@ function Taskv2Node({ id, data, type }: NodeProps) { const thisBlockIsPlaying = workflowRunIsRunningOrQueued && thisBlockIsTargetted; const { updateNodeData } = useReactFlow(); + const [facing, setFacing] = useState<"front" | "back">("front"); + const blockScriptStore = useBlockScriptStore(); + const script = blockScriptStore.scripts[label]; const isFirstWorkflowBlock = useIsFirstBlockInWorkflow({ id }); const rerender = useRerender({ prefix: "accordian" }); @@ -54,151 +60,161 @@ function Taskv2Node({ id, data, type }: NodeProps) { updateNodeData(id, { [key]: value }); } + useEffect(() => { + setFacing(data.showCode ? "back" : "front"); + }, [data.showCode]); + return ( -
- - -
- +
+ -
-
-
- - {isFirstWorkflowBlock ? ( -
- Tip: Use the {"+"} button to add parameters! -
- ) : null} -
- { - handleChange("prompt", value); - }} - value={inputs.prompt} - placeholder={placeholders[type]["prompt"]} - className="nopan text-xs" - /> -
-
- - { - handleChange("url", value); - }} - value={inputs.url} - placeholder={placeholders[type]["url"]} - className="nopan text-xs" - /> -
-
- - rerender.bump()} + +
- - - Advanced Settings - - -
- { - handleChange("model", value); - }} - /> -
-
- - + +
+
+
+ + {isFirstWorkflowBlock ? ( +
+ Tip: Use the {"+"} button to add parameters!
- { - handleChange("maxSteps", Number(event.target.value)); - }} - /> -
-
-
- - -
- { - handleChange("totpIdentifier", value); - }} - value={inputs.totpIdentifier ?? ""} - placeholder={placeholders["navigation"]["totpIdentifier"]} - className="nopan text-xs" - /> -
-
-
- - -
- { - handleChange("totpVerificationUrl", value); - }} - value={inputs.totpVerificationUrl ?? ""} - placeholder={placeholders["task"]["totpVerificationUrl"]} - className="nopan text-xs" - /> -
+ ) : null}
- - - - + { + handleChange("prompt", value); + }} + value={inputs.prompt} + placeholder={placeholders[type]["prompt"]} + className="nopan text-xs" + /> +
+
+ + { + handleChange("url", value); + }} + value={inputs.url} + placeholder={placeholders[type]["url"]} + className="nopan text-xs" + /> +
+
+ + rerender.bump()} + > + + + Advanced Settings + + +
+ { + handleChange("model", value); + }} + /> +
+
+ + +
+ { + handleChange("maxSteps", Number(event.target.value)); + }} + /> +
+
+
+ + +
+ { + handleChange("totpIdentifier", value); + }} + value={inputs.totpIdentifier ?? ""} + placeholder={placeholders["navigation"]["totpIdentifier"]} + className="nopan text-xs" + /> +
+
+
+ + +
+ { + handleChange("totpVerificationUrl", value); + }} + value={inputs.totpVerificationUrl ?? ""} + placeholder={placeholders["task"]["totpVerificationUrl"]} + className="nopan text-xs" + /> +
+
+
+
+
+ +
-
+ + + ); } diff --git a/skyvern-frontend/src/routes/workflows/types/workflowTypes.ts b/skyvern-frontend/src/routes/workflows/types/workflowTypes.ts index c2be2de4..3f5e1aea 100644 --- a/skyvern-frontend/src/routes/workflows/types/workflowTypes.ts +++ b/skyvern-frontend/src/routes/workflows/types/workflowTypes.ts @@ -247,6 +247,7 @@ export const scriptableWorkflowBlockTypes: Set = new Set([ "login", "navigation", "task", + "task_v2", "validation", ]);