From 42bdb2311833b79b917144304e543c56bbbea47c Mon Sep 17 00:00:00 2001 From: Marc Kelechava Date: Thu, 11 Dec 2025 15:52:24 -0800 Subject: [PATCH] Add output and ability to edit body in HttpRequestBlock debug block (#4276) --- .../nodes/HttpRequestNode/HttpRequestNode.tsx | 60 ++++++++++++++++++- 1 file changed, 57 insertions(+), 3 deletions(-) diff --git a/skyvern-frontend/src/routes/workflows/editor/nodes/HttpRequestNode/HttpRequestNode.tsx b/skyvern-frontend/src/routes/workflows/editor/nodes/HttpRequestNode/HttpRequestNode.tsx index 2bd0991e..f3324db0 100644 --- a/skyvern-frontend/src/routes/workflows/editor/nodes/HttpRequestNode/HttpRequestNode.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/nodes/HttpRequestNode/HttpRequestNode.tsx @@ -10,6 +10,7 @@ import { useNodeLabelChangeHandler } from "@/routes/workflows/hooks/useLabelChan import { Handle, NodeProps, Position, useEdges, useNodes } from "@xyflow/react"; import { useCallback } from "react"; import { NodeHeader } from "../components/NodeHeader"; +import { NodeTabs } from "../components/NodeTabs"; import type { WorkflowBlockType } from "@/routes/workflows/types/workflowTypes"; import type { HttpRequestNode as HttpRequestNodeType } from "./types"; import { HelpTooltip } from "@/components/HelpTooltip"; @@ -30,7 +31,13 @@ import { } from "@/components/ui/select"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; import { CodeIcon, PlusIcon, MagicWandIcon } from "@radix-ui/react-icons"; +import { WorkflowBlockParameterSelect } from "../WorkflowBlockParameterSelect"; import { CurlImportDialog } from "./CurlImportDialog"; import { QuickHeadersDialog } from "./QuickHeadersDialog"; import { MethodBadge, UrlValidator, RequestPreview } from "./HttpUtils"; @@ -116,6 +123,30 @@ function HttpRequestNode({ id, data, type }: NodeProps) { const showBodyEditor = data.method !== "GET" && data.method !== "HEAD" && data.method !== "DELETE"; + const handleAddParameterToBody = useCallback( + (parameterKey: string) => { + const parameterSyntax = `{{ ${parameterKey} }}`; + const currentBody = data.body || "{}"; + try { + const parsed = JSON.parse(currentBody); + // Add as a new field with unique key + const existingKeys = Object.keys(parsed); + let keyIndex = existingKeys.length + 1; + let newKey = `param_${keyIndex}`; + while (existingKeys.includes(newKey)) { + keyIndex++; + newKey = `param_${keyIndex}`; + } + parsed[newKey] = parameterSyntax; + update({ body: JSON.stringify(parsed, null, 2) }); + } catch { + // If invalid JSON, reset to valid JSON with the parameter + update({ body: JSON.stringify({ param_1: parameterSyntax }, null, 2) }); + } + }, + [data.body, update], + ); + return (
) { {/* Body Section */} {showBodyEditor && (
-
- - +
+
+ + +
+ + + + + + + +
) {
+ +
);