Skip to content

Commit de3a760

Browse files
authored
fix: workflow add next node from knowledge retrieval node (langgenius#4467)
1 parent 0ac5d62 commit de3a760

File tree

3 files changed

+81
-11
lines changed

3 files changed

+81
-11
lines changed

web/app/components/workflow/hooks/use-nodes-interactions.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,7 @@ export const useNodesInteractions = () => {
466466
const prevNode = nodes[prevNodeIndex]
467467
const outgoers = getOutgoers(prevNode, nodes, edges).sort((a, b) => a.position.y - b.position.y)
468468
const lastOutgoer = outgoers[outgoers.length - 1]
469-
if (prevNode.data.type === BlockEnum.KnowledgeRetrieval)
470-
targetHandle = prevNodeId
469+
471470
newNode.data._connectedTargetHandleIds = [targetHandle]
472471
newNode.data._connectedSourceHandleIds = []
473472
newNode.position = {
@@ -593,8 +592,7 @@ export const useNodesInteractions = () => {
593592
if (prevNodeId && nextNodeId) {
594593
const prevNode = nodes.find(node => node.id === prevNodeId)!
595594
const nextNode = nodes.find(node => node.id === nextNodeId)!
596-
if (prevNode.data.type === BlockEnum.KnowledgeRetrieval)
597-
targetHandle = prevNodeId
595+
598596
newNode.data._connectedTargetHandleIds = [targetHandle]
599597
newNode.data._connectedSourceHandleIds = [sourceHandle]
600598
newNode.position = {
@@ -925,10 +923,6 @@ export const useNodesInteractions = () => {
925923
edges,
926924
} = store.getState()
927925

928-
const edgeSelected = edges.some(edge => edge.selected)
929-
if (edgeSelected)
930-
return
931-
932926
const nodes = getNodes()
933927
const bundledNodes = nodes.filter(node => node.data._isBundled && node.data.type !== BlockEnum.Start)
934928

@@ -937,6 +931,10 @@ export const useNodesInteractions = () => {
937931
return
938932
}
939933

934+
const edgeSelected = edges.some(edge => edge.selected)
935+
if (edgeSelected)
936+
return
937+
940938
const selectedNode = nodes.find(node => node.data.selected && node.data.type !== BlockEnum.Start)
941939

942940
if (selectedNode)

web/app/components/workflow/hooks/use-selection-interactions.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,40 @@ export const useSelectionInteractions = () => {
101101
setNodes(newNodes)
102102
}, [store, workflowStore])
103103

104+
const handleSelectionCancel = useCallback(() => {
105+
const {
106+
getNodes,
107+
setNodes,
108+
edges,
109+
setEdges,
110+
} = store.getState()
111+
112+
store.setState({
113+
userSelectionRect: null,
114+
userSelectionActive: true,
115+
})
116+
117+
const nodes = getNodes()
118+
const newNodes = produce(nodes, (draft) => {
119+
draft.forEach((node) => {
120+
if (node.data._isBundled)
121+
node.data._isBundled = false
122+
})
123+
})
124+
setNodes(newNodes)
125+
const newEdges = produce(edges, (draft) => {
126+
draft.forEach((edge) => {
127+
if (edge.data._isBundled)
128+
edge.data._isBundled = false
129+
})
130+
})
131+
setEdges(newEdges)
132+
}, [store])
133+
104134
return {
105135
handleSelectionStart,
106136
handleSelectionChange,
107137
handleSelectionDrag,
138+
handleSelectionCancel,
108139
}
109140
}

web/app/components/workflow/operator/control.tsx

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1-
import { memo } from 'react'
1+
import { memo, useCallback } from 'react'
22
import { useTranslation } from 'react-i18next'
33
import cn from 'classnames'
4+
import { useKeyPress } from 'ahooks'
45
import {
56
useNodesReadOnly,
7+
useSelectionInteractions,
68
useWorkflow,
79
} from '../hooks'
10+
import { isEventTargetInputArea } from '../utils'
811
import { useStore } from '../store'
912
import AddBlock from './add-block'
1013
import TipPopup from './tip-popup'
@@ -27,6 +30,44 @@ const Control = () => {
2730
nodesReadOnly,
2831
getNodesReadOnly,
2932
} = useNodesReadOnly()
33+
const { handleSelectionCancel } = useSelectionInteractions()
34+
35+
const handleModePointer = useCallback(() => {
36+
if (getNodesReadOnly())
37+
return
38+
setControlMode('pointer')
39+
}, [getNodesReadOnly, setControlMode])
40+
const handleModeHand = useCallback(() => {
41+
if (getNodesReadOnly())
42+
return
43+
setControlMode('hand')
44+
handleSelectionCancel()
45+
}, [getNodesReadOnly, setControlMode, handleSelectionCancel])
46+
47+
useKeyPress('h', (e) => {
48+
if (getNodesReadOnly())
49+
return
50+
51+
if (isEventTargetInputArea(e.target as HTMLElement))
52+
return
53+
54+
e.preventDefault()
55+
handleModeHand()
56+
}, {
57+
exactMatch: true,
58+
useCapture: true,
59+
})
60+
61+
useKeyPress('v', (e) => {
62+
if (isEventTargetInputArea(e.target as HTMLElement))
63+
return
64+
65+
e.preventDefault()
66+
handleModePointer()
67+
}, {
68+
exactMatch: true,
69+
useCapture: true,
70+
})
3071

3172
const goLayout = () => {
3273
if (getNodesReadOnly())
@@ -45,7 +86,7 @@ const Control = () => {
4586
controlMode === 'pointer' ? 'bg-primary-50 text-primary-600' : 'hover:bg-black/5 hover:text-gray-700',
4687
`${nodesReadOnly && '!cursor-not-allowed opacity-50'}`,
4788
)}
48-
onClick={() => setControlMode('pointer')}
89+
onClick={handleModePointer}
4990
>
5091
{
5192
controlMode === 'pointer' ? <Cursor02CSolid className='w-4 h-4' /> : <Cursor02C className='w-4 h-4' />
@@ -59,7 +100,7 @@ const Control = () => {
59100
controlMode === 'hand' ? 'bg-primary-50 text-primary-600' : 'hover:bg-black/5 hover:text-gray-700',
60101
`${nodesReadOnly && '!cursor-not-allowed opacity-50'}`,
61102
)}
62-
onClick={() => setControlMode('hand')}
103+
onClick={handleModeHand}
63104
>
64105
{
65106
controlMode === 'hand' ? <Hand02Solid className='w-4 h-4' /> : <Hand02 className='w-4 h-4' />

0 commit comments

Comments
 (0)