diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/NodeOutputs.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/NodeOutputs.tsx index dcc25943b05f..827a68e31c69 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/NodeOutputs.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/NodeOutputs.tsx @@ -1,5 +1,10 @@ import type { NodeDataType } from "@/types/flow"; import { OutputParameter } from "."; +import { + getDisplayOutput, + separateOutputsByGroup, + shouldShowAllOutputs, +} from "./nodeOutputUtils"; export default function NodeOutputs({ outputs, @@ -9,10 +14,8 @@ export default function NodeOutputs({ selected, showNode, isToolMode, - showHiddenOutputs, selectedOutput, handleSelectOutput, - hasExistingHiddenOutputs = false, }: { outputs: any; keyPrefix: string; @@ -21,28 +24,20 @@ export default function NodeOutputs({ selected: boolean; showNode: boolean; isToolMode: boolean; - showHiddenOutputs: boolean; selectedOutput: any; handleSelectOutput: any; - hasExistingHiddenOutputs?: boolean; }) { - const hasLoopOutput = outputs.some((output) => output.allows_loop); - const hasGroupOutputs = outputs.some((output) => output.group_outputs); - const isConditionalRouter = data.type === "ConditionalRouter"; - const hasHiddenOutputs = outputs.some((output) => output.hidden); + // Separate outputs based on group_outputs field + const { groupedOutputs, individualOutputs } = separateOutputsByGroup( + outputs, + ) as { groupedOutputs: any[]; individualOutputs: any[] }; - const shouldShowAllOutputs = - hasLoopOutput || hasGroupOutputs || isConditionalRouter || hasHiddenOutputs; - - if (shouldShowAllOutputs) { - const outputsToRender = - keyPrefix === "hidden" - ? outputs.filter((output) => output.hidden) - : outputs.filter((output) => !output.hidden); + const shouldShowAll = shouldShowAllOutputs(outputs, data); + if (shouldShowAll) { return ( <> - {outputsToRender?.map((output, idx) => ( + {outputs?.map((output: any, idx: number) => ( out.name === output.name, ) ?? idx } - lastOutput={idx === outputsToRender.length - 1} + lastOutput={idx === outputs.length - 1} data={data} types={types} selected={selected} showNode={showNode} isToolMode={isToolMode} - showHiddenOutputs={showHiddenOutputs} handleSelectOutput={handleSelectOutput} - hidden={ - keyPrefix === "hidden" - ? showHiddenOutputs - ? output.hidden - : true - : false - } /> ))} ); } - const getDisplayOutput = () => { - const filteredOutputs = - keyPrefix === "hidden" - ? outputs.filter((output) => output.hidden) - : outputs.filter((output) => !output.hidden); - - const outputWithSelection = filteredOutputs.find( - (output) => output.name === selectedOutput?.name, - ); - - return outputWithSelection || filteredOutputs[0]; + // Handle individual outputs (group_outputs: false) + const renderIndividualOutputs = () => { + return individualOutputs.map((output: any, idx: number) => ( + out.name === output.name, + ) ?? idx + } + lastOutput={ + groupedOutputs.length === 0 && idx === individualOutputs.length - 1 + } + data={data} + types={types} + selected={selected} + showNode={showNode} + isToolMode={isToolMode} + handleSelectOutput={handleSelectOutput} + /> + )); }; - const displayOutput = getDisplayOutput(); + // Handle grouped outputs (group_outputs: true) - show as dropdown + const renderGroupedOutputs = () => { + if (groupedOutputs.length === 0) return null; - if (!displayOutput) return null; + const displayOutput = getDisplayOutput(groupedOutputs, selectedOutput); + + return ( + out.name === displayOutput.name, + ) ?? 0 + } + lastOutput={true} + data={data} + types={types} + selected={selected} + handleSelectOutput={handleSelectOutput} + showNode={showNode} + isToolMode={isToolMode} + /> + ); + }; return ( - out.name === displayOutput.name, - ) ?? 0 - } - lastOutput={!hasExistingHiddenOutputs} - data={data} - types={types} - selected={selected} - handleSelectOutput={handleSelectOutput} - showNode={showNode} - isToolMode={isToolMode} - showHiddenOutputs={showHiddenOutputs} - hidden={ - keyPrefix === "hidden" - ? showHiddenOutputs - ? displayOutput.hidden - : true - : false - } - /> + <> + {renderIndividualOutputs()} + {renderGroupedOutputs()} + ); } diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/index.tsx index 98605f7b93e2..2ce06d8419a4 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeOutputParameter/index.tsx @@ -13,9 +13,7 @@ export const OutputParameter = ({ types, selected, showNode, - showHiddenOutputs, isToolMode, - hidden, handleSelectOutput, }) => { const id = useMemo( @@ -40,7 +38,6 @@ export const OutputParameter = ({ return (