Use free input for loop value parameter (#1483)

This commit is contained in:
Shuchang Zheng
2025-01-04 02:54:46 -08:00
committed by GitHub
parent 187c18d83c
commit 1d49dadca3
2 changed files with 7 additions and 38 deletions

View File

@@ -1,12 +1,6 @@
import { HelpTooltip } from "@/components/HelpTooltip"; import { HelpTooltip } from "@/components/HelpTooltip";
import { Label } from "@/components/ui/label"; import { Label } from "@/components/ui/label";
import { import { WorkflowBlockInput } from "@/components/WorkflowBlockInput";
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback"; import { useDeleteNodeCallback } from "@/routes/workflows/hooks/useDeleteNodeCallback";
import { useNodeLabelChangeHandler } from "@/routes/workflows/hooks/useLabelChangeHandler"; import { useNodeLabelChangeHandler } from "@/routes/workflows/hooks/useLabelChangeHandler";
import { WorkflowBlockTypes } from "@/routes/workflows/types/workflowTypes"; import { WorkflowBlockTypes } from "@/routes/workflows/types/workflowTypes";
@@ -15,14 +9,11 @@ import {
Handle, Handle,
NodeProps, NodeProps,
Position, Position,
useEdges,
useNodes, useNodes,
useReactFlow, useReactFlow,
} from "@xyflow/react"; } from "@xyflow/react";
import { AppNode } from ".."; import { AppNode } from "..";
import { helpTooltips } from "../../helpContent"; import { helpTooltips } from "../../helpContent";
import { useWorkflowParametersState } from "../../useWorkflowParametersState";
import { getAvailableOutputParameterKeys } from "../../workflowEditorUtils";
import { EditableNodeTitle } from "../components/EditableNodeTitle"; import { EditableNodeTitle } from "../components/EditableNodeTitle";
import { NodeActionMenu } from "../NodeActionMenu"; import { NodeActionMenu } from "../NodeActionMenu";
import { WorkflowBlockIcon } from "../WorkflowBlockIcon"; import { WorkflowBlockIcon } from "../WorkflowBlockIcon";
@@ -31,20 +22,12 @@ import type { LoopNode } from "./types";
function LoopNode({ id, data }: NodeProps<LoopNode>) { function LoopNode({ id, data }: NodeProps<LoopNode>) {
const { updateNodeData } = useReactFlow(); const { updateNodeData } = useReactFlow();
const nodes = useNodes<AppNode>(); const nodes = useNodes<AppNode>();
const edges = useEdges();
const [label, setLabel] = useNodeLabelChangeHandler({ const [label, setLabel] = useNodeLabelChangeHandler({
id, id,
initialValue: data.label, initialValue: data.label,
}); });
const deleteNodeCallback = useDeleteNodeCallback(); const deleteNodeCallback = useDeleteNodeCallback();
const [workflowParameters] = useWorkflowParametersState();
const parameters = workflowParameters.filter(
(parameter) => parameter.parameterType !== "credential",
);
const parameterKeys = parameters.map((parameter) => parameter.key);
const outputParameterKeys = getAvailableOutputParameterKeys(nodes, edges, id);
const children = nodes.filter((node) => node.parentId === id); const children = nodes.filter((node) => node.parentId === id);
const furthestDownChild: Node | null = children.reduce( const furthestDownChild: Node | null = children.reduce(
(acc, child) => { (acc, child) => {
@@ -113,30 +96,16 @@ function LoopNode({ id, data }: NodeProps<LoopNode>) {
</div> </div>
<div className="space-y-2"> <div className="space-y-2">
<div className="flex gap-2"> <div className="flex gap-2">
<Label className="text-xs text-slate-300"> <Label className="text-xs text-slate-300">Loop Value</Label>
Loop Value Parameter
</Label>
<HelpTooltip content={helpTooltips["loop"]["loopValue"]} /> <HelpTooltip content={helpTooltips["loop"]["loopValue"]} />
</div> </div>
<Select <WorkflowBlockInput
nodeId={id}
value={data.loopValue} value={data.loopValue}
onValueChange={(value) => { onChange={(value) => {
updateNodeData(id, { loopValue: value }); updateNodeData(id, { loopValue: value });
}} }}
> />
<SelectTrigger>
<SelectValue placeholder="Select the parameter to iterate over" />
</SelectTrigger>
<SelectContent>
{[...parameterKeys, ...outputParameterKeys].map(
(parameterKey) => (
<SelectItem key={parameterKey} value={parameterKey}>
{parameterKey}
</SelectItem>
),
)}
</SelectContent>
</Select>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1688,7 +1688,7 @@ function getWorkflowErrors(nodes: Array<AppNode>): Array<string> {
); );
if (emptyLoopNodes.length > 0) { if (emptyLoopNodes.length > 0) {
emptyLoopNodes.forEach((node) => { emptyLoopNodes.forEach((node) => {
errors.push(`${node.data.label}: Loop value parameter must be selected.`); errors.push(`${node.data.label}: Loop value parameter is required.`);
}); });
} }