diff --git a/web/app/components/workflow/custom-edge.tsx b/web/app/components/workflow/custom-edge.tsx index 65e3c9ccdd..8a31c98957 100644 --- a/web/app/components/workflow/custom-edge.tsx +++ b/web/app/components/workflow/custom-edge.tsx @@ -42,7 +42,7 @@ const CustomEdge = ({ /> { - data?.hovering && ( + data?._hovering && (
{ const setShowFeaturesPanel = useStore(state => state.setShowFeaturesPanel) return ( -
+
Features
diff --git a/web/app/components/workflow/hooks.ts b/web/app/components/workflow/hooks.ts index 5ca5ead4cc..17235e6456 100644 --- a/web/app/components/workflow/hooks.ts +++ b/web/app/components/workflow/hooks.ts @@ -5,6 +5,7 @@ import type { NodeDragHandler, NodeMouseHandler, OnConnect, + OnEdgesChange, } from 'reactflow' import { getConnectedEdges, @@ -258,7 +259,10 @@ export const useWorkflow = () => { const newCurrentNode: Node = { id: `${Date.now()}`, type: 'custom', - data: NodeInitialData[nodeType], + data: { + ...NodeInitialData[nodeType], + _selected: currentNode.data._selected, + }, position: { x: currentNode.position.x, y: currentNode.position.y, @@ -332,6 +336,21 @@ export const useWorkflow = () => { setEdges(newEdges) }, [store]) + const handleEdgesChange = useCallback((changes) => { + const { + edges, + setEdges, + } = store.getState() + + const newEdges = produce(edges, (draft) => { + changes.forEach((change) => { + if (change.type === 'select') + draft.find(edge => edge.id === change.id)!.selected = change.selected + }) + }) + setEdges(newEdges) + }, [store]) + return { handleLayout, @@ -351,5 +370,6 @@ export const useWorkflow = () => { handleEdgeEnter, handleEdgeLeave, handleEdgeDelete, + handleEdgesChange, } } diff --git a/web/app/components/workflow/index.tsx b/web/app/components/workflow/index.tsx index 81d22a7616..365e9fb416 100644 --- a/web/app/components/workflow/index.tsx +++ b/web/app/components/workflow/index.tsx @@ -50,7 +50,7 @@ const Workflow: FC = memo(({ }) => { const showFeaturesPanel = useStore(state => state.showFeaturesPanel) const [nodes] = useNodesState(initialNodes) - const [edges, _, onEdgesChange] = useEdgesState(initialEdges) + const [edges] = useEdgesState(initialEdges) const { handleNodeDragStart, @@ -64,6 +64,7 @@ const Workflow: FC = memo(({ handleEdgeEnter, handleEdgeLeave, handleEdgeDelete, + handleEdgesChange, } = useWorkflow() useKeyPress('Backspace', handleEdgeDelete) @@ -90,7 +91,7 @@ const Workflow: FC = memo(({ onConnect={handleNodeConnect} onEdgeMouseEnter={handleEdgeEnter} onEdgeMouseLeave={handleEdgeLeave} - onEdgesChange={onEdgesChange} + onEdgesChange={handleEdgesChange} multiSelectionKeyCode={null} connectionLineComponent={CustomConnectionLine} deleteKeyCode={null} diff --git a/web/app/components/workflow/nodes/_base/components/node-handle.tsx b/web/app/components/workflow/nodes/_base/components/node-handle.tsx index f2d185bbc3..22645f5571 100644 --- a/web/app/components/workflow/nodes/_base/components/node-handle.tsx +++ b/web/app/components/workflow/nodes/_base/components/node-handle.tsx @@ -69,7 +69,7 @@ export const NodeTargetHandle = ({ triggerClassName={open => ` hidden absolute left-0 top-0 pointer-events-none ${nodeSelectorClassName} - ${data.hovering && '!flex'} + ${data._hovering && '!flex'} ${open && '!flex'} `} /> @@ -128,7 +128,7 @@ export const NodeSourceHandle = ({ triggerClassName={open => ` hidden absolute top-0 left-0 pointer-events-none ${nodeSelectorClassName} - ${data.hovering && '!flex'} + ${data._hovering && '!flex'} ${open && '!flex'} `} /> diff --git a/web/app/components/workflow/nodes/_base/panel.tsx b/web/app/components/workflow/nodes/_base/panel.tsx index 64a2a5b458..173c353aca 100644 --- a/web/app/components/workflow/nodes/_base/panel.tsx +++ b/web/app/components/workflow/nodes/_base/panel.tsx @@ -7,7 +7,8 @@ import { memo, useCallback, } from 'react' -import type { Node } from '../../types' +import { type Node } from '../../types' +import { BlockEnum } from '../../types' import BlockIcon from '../../block-icon' import { useWorkflow } from '../../hooks' import { canRunBySingle } from '../../utils' @@ -86,19 +87,23 @@ const BasePanel: FC = ({ />
-
+
{cloneElement(children, { id, data })}
-
-
- - NEXT STEP -
-
- Add the next block in this workflow -
- -
+ { + data.type !== BlockEnum.End && ( +
+
+ + NEXT STEP +
+
+ Add the next block in this workflow +
+ +
+ ) + }
) }