diff --git a/src/frontend/src/CustomNodes/genericNode/components/OutputComponent/index.tsx b/src/frontend/src/CustomNodes/genericNode/components/OutputComponent/index.tsx index f684a902f..0a0b05738 100644 --- a/src/frontend/src/CustomNodes/genericNode/components/OutputComponent/index.tsx +++ b/src/frontend/src/CustomNodes/genericNode/components/OutputComponent/index.tsx @@ -12,6 +12,7 @@ import { outputComponentType } from "../../../../types/components"; import { NodeDataType } from "../../../../types/flow"; import { cn } from "../../../../utils/utils"; import { Button } from "../../../../components/ui/button"; +import ShadTooltip from "../../../../components/shadTooltipComponent"; export default function OutputComponent({ selected, @@ -20,6 +21,7 @@ export default function OutputComponent({ nodeId, idx, name, + proxy, }: outputComponentType) { const setNode = useFlowStore((state) => state.setNode); const updateNodeInternals = useUpdateNodeInternals(); @@ -64,7 +66,13 @@ export default function OutputComponent({ ))} - {name} + {proxy ? ( + {proxy.id}}> + {name} + + ) : ( + {name} + )} ); } diff --git a/src/frontend/src/CustomNodes/genericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/genericNode/components/parameterComponent/index.tsx index 84e4587b1..3c35515f0 100644 --- a/src/frontend/src/CustomNodes/genericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/genericNode/components/parameterComponent/index.tsx @@ -61,6 +61,7 @@ export default function ParameterComponent({ showNode, index, outputName, + outputProxy, }: ParameterComponentType): JSX.Element { const infoHtml = useRef(null); const nodes = useFlowStore((state) => state.nodes); @@ -79,8 +80,7 @@ export default function ParameterComponent({ handleUpdateValues, debouncedHandleUpdateValues, setNode, - isLoading, - setIsLoading + setIsLoading, ); const { handleNodeClass: handleNodeClassHook } = useHandleNodeClass( @@ -88,7 +88,7 @@ export default function ParameterComponent({ name, takeSnapshot, setNode, - updateNodeInternals + updateNodeInternals, ); const { handleRefreshButtonPress: handleRefreshButtonPressHook } = @@ -97,7 +97,7 @@ export default function ParameterComponent({ let disabled = edges.some( (edge) => - edge.targetHandle === scapedJSONStringfy(proxy ? { ...id, proxy } : id) + edge.targetHandle === scapedJSONStringfy(proxy ? { ...id, proxy } : id), ) ?? false; const handleRefreshButtonPress = async (name, data) => { @@ -108,7 +108,7 @@ export default function ParameterComponent({ const handleOnNewValue = async ( newValue: string | string[] | boolean | Object[], - skipSnapshot: boolean | undefined = false + skipSnapshot: boolean | undefined = false, ): Promise => { handleOnNewValueHook(newValue, skipSnapshot); }; @@ -133,6 +133,7 @@ export default function ParameterComponent({ function renderTitle() { return !left ? ( { setFilterEdge( - groupByFamily(myData, tooltipTitle!, left, nodes!) + groupByFamily(myData, tooltipTitle!, left, nodes!), ); }} > @@ -286,12 +287,12 @@ export default function ParameterComponent({ } className={classNames( left ? "-ml-0.5" : "-mr-0.5", - "h-3 w-3 rounded-full border-2 bg-background" + "h-3 w-3 rounded-full border-2 bg-background", )} style={{ borderColor: color ?? nodeColors.unknown }} onClick={() => { setFilterEdge( - groupByFamily(myData, tooltipTitle!, left, nodes!) + groupByFamily(myData, tooltipTitle!, left, nodes!), ); }} /> diff --git a/src/frontend/src/CustomNodes/genericNode/index.tsx b/src/frontend/src/CustomNodes/genericNode/index.tsx index 2e15ae6ec..c1c05f68d 100644 --- a/src/frontend/src/CustomNodes/genericNode/index.tsx +++ b/src/frontend/src/CustomNodes/genericNode/index.tsx @@ -837,7 +837,8 @@ export default function GenericNode({ nodeColors[types[data.type]] ?? nodeColors.unknown } - title={output.name} + outputProxy={output.proxy} + title={output.display_name ?? output.name} tooltipTitle={output.selected ?? output.types[0]} id={{ output_types: [output.selected ?? output.types[0]], diff --git a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx index 9c5c02b21..25e6b6643 100644 --- a/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx +++ b/src/frontend/src/pages/FlowPage/components/PageComponent/index.tsx @@ -11,7 +11,6 @@ import ReactFlow, { SelectionDragHandler, updateEdge, } from "reactflow"; -import GenericNode from "../../../../CustomNodes/GenericNode"; import { INVALID_SELECTION_ERROR_ALERT, UPLOAD_ALERT_LIST, @@ -38,6 +37,7 @@ import ConnectionLineComponent from "../ConnectionLineComponent"; import SelectionMenu from "../SelectionMenuComponent"; import getRandomName from "./utils/get-random-name"; import isWrappedWithClass from "./utils/is-wrapped-with-class"; +import GenericNode from "../../../../CustomNodes/genericNode"; const nodeTypes = { genericNode: GenericNode, @@ -52,19 +52,19 @@ export default function Page({ }): JSX.Element { const uploadFlow = useFlowsManagerStore((state) => state.uploadFlow); const autoSaveCurrentFlow = useFlowsManagerStore( - (state) => state.autoSaveCurrentFlow + (state) => state.autoSaveCurrentFlow, ); const types = useTypesStore((state) => state.types); const templates = useTypesStore((state) => state.templates); const setFilterEdge = useFlowStore((state) => state.setFilterEdge); const reactFlowWrapper = useRef(null); const [showCanvas, setSHowCanvas] = useState( - Object.keys(templates).length > 0 && Object.keys(types).length > 0 + Object.keys(templates).length > 0 && Object.keys(types).length > 0, ); const reactFlowInstance = useFlowStore((state) => state.reactFlowInstance); const setReactFlowInstance = useFlowStore( - (state) => state.setReactFlowInstance + (state) => state.setReactFlowInstance, ); const nodes = useFlowStore((state) => state.nodes); const edges = useFlowStore((state) => state.edges); @@ -81,10 +81,10 @@ export default function Page({ const paste = useFlowStore((state) => state.paste); const resetFlow = useFlowStore((state) => state.resetFlow); const lastCopiedSelection = useFlowStore( - (state) => state.lastCopiedSelection + (state) => state.lastCopiedSelection, ); const setLastCopiedSelection = useFlowStore( - (state) => state.setLastCopiedSelection + (state) => state.setLastCopiedSelection, ); const onConnect = useFlowStore((state) => state.onConnect); const currentFlowId = useFlowsManagerStore((state) => state.currentFlowId); @@ -107,7 +107,7 @@ export default function Page({ clonedSelection!, clonedNodes, clonedEdges, - getRandomName() + getRandomName(), ); const newGroupNode = generateNodeFromFlow(newFlow, getNodeId); // const newEdges = reconnectEdges(newGroupNode, removedEdges); @@ -115,8 +115,8 @@ export default function Page({ ...clonedNodes.filter( (oldNodes) => !clonedSelection?.nodes.some( - (selectionNode) => selectionNode.id === oldNodes.id - ) + (selectionNode) => selectionNode.id === oldNodes.id, + ), ), newGroupNode, ]); @@ -180,7 +180,7 @@ export default function Page({ { x: position.current.x, y: position.current.y, - } + }, ); } if (!isWrappedWithClass(event, "noundo")) { @@ -276,7 +276,7 @@ export default function Page({ useEffect(() => { setSHowCanvas( - Object.keys(templates).length > 0 && Object.keys(types).length > 0 + Object.keys(templates).length > 0 && Object.keys(types).length > 0, ); }, [templates, types]); @@ -285,7 +285,7 @@ export default function Page({ takeSnapshot(); onConnect(params); }, - [takeSnapshot, onConnect] + [takeSnapshot, onConnect], ); const onNodeDragStart: NodeDragHandler = useCallback(() => { @@ -326,7 +326,7 @@ export default function Page({ // Extract the data from the drag event and parse it as a JSON object const data: { type: string; node?: APIClassType } = JSON.parse( - event.dataTransfer.getData("nodedata") + event.dataTransfer.getData("nodedata"), ); const newId = getNodeId(data.type); @@ -342,7 +342,7 @@ export default function Page({ }; paste( { nodes: [newNode], edges: [] }, - { x: event.clientX, y: event.clientY } + { x: event.clientX, y: event.clientY }, ); } else if (event.dataTransfer.types.some((types) => types === "Files")) { takeSnapshot(); @@ -371,7 +371,7 @@ export default function Page({ } }, // Specify dependencies for useCallback - [getNodeId, setNodes, takeSnapshot, paste] + [getNodeId, setNodes, takeSnapshot, paste], ); const onEdgeUpdateStart = useCallback(() => { @@ -387,7 +387,7 @@ export default function Page({ setEdges((els) => updateEdge(oldEdge, newConnection, els)); } }, - [setEdges] + [setEdges], ); const onEdgeUpdateEnd = useCallback((_, edge: Edge): void => { @@ -420,7 +420,7 @@ export default function Page({ (flow: OnSelectionChangeParams): void => { setLastSelection(flow); }, - [] + [], ); const onPaneClick = useCallback((flow) => { diff --git a/src/frontend/src/types/api/index.ts b/src/frontend/src/types/api/index.ts index bb36564f8..4eea200b9 100644 --- a/src/frontend/src/types/api/index.ts +++ b/src/frontend/src/types/api/index.ts @@ -63,12 +63,19 @@ export type InputFieldType = { refresh_button_text?: string; [key: string]: any; }; + +export type OutputFieldProxyType = { + id: string; + name: string; + nodeDisplayName: string; +}; + export type OutputFieldType = { types: Array; selected?: string; name: string; - displayName?: string; - proxy?: { id: string; name: string }; + display_name: string; + proxy?: OutputFieldProxyType; }; export type sendAllProps = { nodes: Node[]; diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index ba6cab7b8..edcda4a25 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -1,7 +1,12 @@ import { ReactElement, ReactNode, SetStateAction } from "react"; import { ReactFlowJsonObject } from "reactflow"; import { InputOutput } from "../../constants/enums"; -import { APIClassType, APITemplateType, InputFieldType } from "../api"; +import { + APIClassType, + APITemplateType, + InputFieldType, + OutputFieldProxyType, +} from "../api"; import { ChatMessageType } from "../chat"; import { FlowStyleType, FlowType, NodeDataType, NodeType } from "../flow/index"; import { sourceHandleType, targetHandleType } from "./../flow/index"; @@ -71,6 +76,7 @@ export type ParameterComponentType = { index: number; onCloseModal?: (close: boolean) => void; outputName?: string; + outputProxy?: OutputFieldProxyType; }; export type InputListComponentType = { value: string[]; @@ -120,6 +126,7 @@ export type outputComponentType = { frozen?: boolean; idx: number; name: string; + proxy?: OutputFieldProxyType; }; export type PromptAreaComponentType = { @@ -528,7 +535,7 @@ export type nodeToolbarPropsType = { updateNodeCode?: ( newNodeClass: APIClassType, code: string, - name: string + name: string, ) => void; setShowState: (show: boolean | SetStateAction) => void; isOutdated?: boolean; @@ -578,7 +585,7 @@ export type chatMessagePropsType = { updateChat: ( chat: ChatMessageType, message: string, - stream_url?: string + stream_url?: string, ) => void; }; @@ -670,12 +677,12 @@ export type codeTabsPropsType = { value: string, node: NodeType, template: InputFieldType, - tweak: tweakType + tweak: tweakType, ) => string; buildTweakObject?: ( tw: string, changes: string | string[] | boolean | number | Object[] | Object, - template: InputFieldType + template: InputFieldType, ) => Promise; }; activeTweaks?: boolean; diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index 37c81cd42..12a5f1c2d 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -483,6 +483,7 @@ export function updateNewOutput({ nodes, edges }: updateEdgesHandleIdsType) { types, selected: selected, name: types.join(" | "), + display_name: types.join(" | "), }); } } @@ -1048,9 +1049,14 @@ function generateNodeOutputs(flow: FlowType) { outputs.push( cloneDeep({ ...output, - proxy: { id: node.id, name: output.name }, + proxy: { + id: node.id, + name: output.name, + nodeDisplayName: + node.data.node!.display_name ?? node.data.node!.name, + }, name: node.id + "_" + output.name, - displayName: output.displayName, + displayName: output.display_name, }), ); }