Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
dify
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ai-tech
dify
Commits
b113711a
Commit
b113711a
authored
Mar 01, 2024
by
StyleZhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hooks
parent
68e95305
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
238 additions
and
189 deletions
+238
-189
page.tsx
web/app/(commonLayout)/workflow/page.tsx
+68
-68
constants.ts
web/app/components/workflow/constants.ts
+1
-1
hooks.ts
web/app/components/workflow/hooks.ts
+104
-70
index.tsx
web/app/components/workflow/index.tsx
+36
-21
add.tsx
...ponents/workflow/nodes/_base/components/next-step/add.tsx
+3
-3
index.tsx
...nents/workflow/nodes/_base/components/next-step/index.tsx
+1
-1
item.tsx
...onents/workflow/nodes/_base/components/next-step/item.tsx
+3
-3
node-handle.tsx
...omponents/workflow/nodes/_base/components/node-handle.tsx
+3
-3
change-block.tsx
...ow/nodes/_base/components/panel-operator/change-block.tsx
+3
-3
index.tsx
.../workflow/nodes/_base/components/panel-operator/index.tsx
+2
-2
node.tsx
web/app/components/workflow/nodes/_base/node.tsx
+1
-6
panel.tsx
web/app/components/workflow/nodes/_base/panel.tsx
+7
-7
index.tsx
web/app/components/workflow/panel/index.tsx
+1
-1
store.ts
web/app/components/workflow/store.ts
+4
-0
types.ts
web/app/components/workflow/types.ts
+1
-0
No files found.
web/app/(commonLayout)/workflow/page.tsx
View file @
b113711a
...
@@ -8,79 +8,79 @@ const initialNodes = [
...
@@ -8,79 +8,79 @@ const initialNodes = [
{
{
id
:
'1'
,
id
:
'1'
,
type
:
'custom'
,
type
:
'custom'
,
position
:
{
x
:
0
,
y
:
0
},
position
:
{
x
:
180
,
y
:
18
0
},
data
:
{
type
:
'start'
},
data
:
{
type
:
'start'
},
},
},
{
//
{
id
:
'2'
,
//
id: '2',
type
:
'custom'
,
//
type: 'custom',
position
:
{
x
:
0
,
y
:
0
},
//
position: { x: 0, y: 0 },
data
:
{
//
data: {
type
:
'if-else'
,
//
type: 'if-else',
branches
:
[
//
branches: [
{
//
{
id
:
'if-true'
,
//
id: 'if-true',
name
:
'IS TRUE'
,
//
name: 'IS TRUE',
},
//
},
{
//
{
id
:
'if-false'
,
//
id: 'if-false',
name
:
'IS FALSE'
,
//
name: 'IS FALSE',
},
//
},
],
//
],
},
//
},
},
//
},
{
//
{
id
:
'3'
,
//
id: '3',
type
:
'custom'
,
//
type: 'custom',
position
:
{
x
:
0
,
y
:
0
},
//
position: { x: 0, y: 0 },
data
:
{
type
:
'question-classifier'
,
sortIndexInBranches
:
0
},
//
data: { type: 'question-classifier', sortIndexInBranches: 0 },
},
//
},
{
//
{
id
:
'4'
,
//
id: '4',
type
:
'custom'
,
//
type: 'custom',
position
:
{
x
:
0
,
y
:
0
},
//
position: { x: 0, y: 0 },
data
:
{
//
data: {
type
:
'if-else'
,
//
type: 'if-else',
sortIndexInBranches
:
1
,
//
sortIndexInBranches: 1,
branches
:
[
//
branches: [
{
//
{
id
:
'if-true'
,
//
id: 'if-true',
name
:
'IS TRUE'
,
//
name: 'IS TRUE',
},
//
},
{
//
{
id
:
'if-false'
,
//
id: 'if-false',
name
:
'IS FALSE'
,
//
name: 'IS FALSE',
},
//
},
],
//
],
},
//
},
},
//
},
]
]
const
initialEdges
=
[
const
initialEdges
=
[
{
//
{
id
:
'0'
,
//
id: '0',
type
:
'custom'
,
//
type: 'custom',
source
:
'1'
,
//
source: '1',
sourceHandle
:
'source'
,
//
sourceHandle: 'source',
target
:
'2'
,
//
target: '2',
targetHandle
:
'target'
,
//
targetHandle: 'target',
},
//
},
{
//
{
id
:
'1'
,
//
id: '1',
type
:
'custom'
,
//
type: 'custom',
source
:
'2'
,
//
source: '2',
sourceHandle
:
'if-true'
,
//
sourceHandle: 'if-true',
target
:
'3'
,
//
target: '3',
targetHandle
:
'target'
,
//
targetHandle: 'target',
},
//
},
{
//
{
id
:
'2'
,
//
id: '2',
type
:
'custom'
,
//
type: 'custom',
source
:
'2'
,
//
source: '2',
sourceHandle
:
'if-false'
,
//
sourceHandle: 'if-false',
target
:
'4'
,
//
target: '4',
targetHandle
:
'target'
,
//
targetHandle: 'target',
},
//
},
]
]
const
Page
:
FC
=
()
=>
{
const
Page
:
FC
=
()
=>
{
...
...
web/app/components/workflow/constants.ts
View file @
b113711a
...
@@ -34,7 +34,7 @@ export const NodeInitialData = {
...
@@ -34,7 +34,7 @@ export const NodeInitialData = {
retrieval_mode
:
'single'
,
retrieval_mode
:
'single'
,
},
},
[
BlockEnum
.
IfElse
]:
{
[
BlockEnum
.
IfElse
]:
{
b
ranches
:
[
targetB
ranches
:
[
{
{
id
:
'if-true'
,
id
:
'if-true'
,
name
:
'IS TRUE'
,
name
:
'IS TRUE'
,
...
...
web/app/components/workflow/hooks.ts
View file @
b113711a
...
@@ -2,6 +2,7 @@ import { useCallback } from 'react'
...
@@ -2,6 +2,7 @@ import { useCallback } from 'react'
import
produce
from
'immer'
import
produce
from
'immer'
import
type
{
import
type
{
EdgeMouseHandler
,
EdgeMouseHandler
,
NodeDragHandler
,
NodeMouseHandler
,
NodeMouseHandler
,
OnConnect
,
OnConnect
,
}
from
'reactflow'
}
from
'reactflow'
...
@@ -17,6 +18,7 @@ import type {
...
@@ -17,6 +18,7 @@ import type {
}
from
'./types'
}
from
'./types'
import
{
NodeInitialData
}
from
'./constants'
import
{
NodeInitialData
}
from
'./constants'
import
{
getLayoutByDagre
}
from
'./utils'
import
{
getLayoutByDagre
}
from
'./utils'
import
{
useStore
}
from
'./store'
export
const
useWorkflow
=
()
=>
{
export
const
useWorkflow
=
()
=>
{
const
store
=
useStoreApi
()
const
store
=
useStoreApi
()
...
@@ -42,7 +44,30 @@ export const useWorkflow = () => {
...
@@ -42,7 +44,30 @@ export const useWorkflow = () => {
setNodes
(
newNodes
)
setNodes
(
newNodes
)
},
[
store
])
},
[
store
])
const
handleEnterNode
=
useCallback
<
NodeMouseHandler
>
((
_
,
node
)
=>
{
const
handleNodeDragStart
=
useCallback
<
NodeDragHandler
>
(()
=>
{
useStore
.
getState
().
setIsDragging
(
true
)
},
[])
const
handleNodeDrag
=
useCallback
<
NodeDragHandler
>
((
e
,
node
:
Node
)
=>
{
const
{
getNodes
,
setNodes
,
}
=
store
.
getState
()
e
.
stopPropagation
()
const
newNodes
=
produce
(
getNodes
(),
(
draft
)
=>
{
const
currentNode
=
draft
.
find
(
n
=>
n
.
id
===
node
.
id
)
!
currentNode
.
position
=
node
.
position
})
setNodes
(
newNodes
)
},
[
store
])
const
handleNodeDragStop
=
useCallback
<
NodeDragHandler
>
(()
=>
{
useStore
.
getState
().
setIsDragging
(
false
)
},
[])
const
handleNodeEnter
=
useCallback
<
NodeMouseHandler
>
((
_
,
node
)
=>
{
const
{
const
{
getNodes
,
getNodes
,
setNodes
,
setNodes
,
...
@@ -67,7 +92,7 @@ export const useWorkflow = () => {
...
@@ -67,7 +92,7 @@ export const useWorkflow = () => {
setEdges
(
newEdges
)
setEdges
(
newEdges
)
},
[
store
])
},
[
store
])
const
handle
LeaveNod
e
=
useCallback
<
NodeMouseHandler
>
((
_
,
node
)
=>
{
const
handle
NodeLeav
e
=
useCallback
<
NodeMouseHandler
>
((
_
,
node
)
=>
{
const
{
const
{
getNodes
,
getNodes
,
setNodes
,
setNodes
,
...
@@ -81,34 +106,37 @@ export const useWorkflow = () => {
...
@@ -81,34 +106,37 @@ export const useWorkflow = () => {
})
})
setNodes
(
newNodes
)
setNodes
(
newNodes
)
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
connectedEdges
=
getConnectedEdges
([
node
],
edges
)
draft
.
forEach
((
edge
)
=>
{
edge
.
data
=
{
...
edge
.
data
,
connectedNodeIsHovering
:
false
}
connectedEdges
.
forEach
((
edge
)
=>
{
const
currentEdge
=
draft
.
find
(
e
=>
e
.
id
===
edge
.
id
)
if
(
currentEdge
)
currentEdge
.
data
=
{
...
currentEdge
.
data
,
connectedNodeIsHovering
:
false
}
})
})
})
})
setEdges
(
newEdges
)
setEdges
(
newEdges
)
},
[
store
])
},
[
store
])
const
handle
SelectNode
=
useCallback
((
nodeId
:
string
,
cancelSelection
?:
boolean
)
=>
{
const
handle
NodeSelect
=
useCallback
((
nodeId
:
string
,
cancelSelection
?:
boolean
)
=>
{
const
{
const
{
getNodes
,
getNodes
,
setNodes
,
setNodes
,
}
=
store
.
getState
()
}
=
store
.
getState
()
const
newNodes
=
produce
(
getNodes
(),
(
draft
)
=>
{
const
newNodes
=
produce
(
getNodes
(),
(
draft
)
=>
{
draft
.
forEach
(
node
=>
node
.
selected
=
false
)
draft
.
forEach
(
node
=>
node
.
data
.
selected
=
false
)
const
selectedNode
=
draft
.
find
(
node
=>
node
.
id
===
nodeId
)
!
const
selectedNode
=
draft
.
find
(
node
=>
node
.
id
===
nodeId
)
!
if
(
!
cancelSelection
)
if
(
!
cancelSelection
)
selectedNode
.
selected
=
true
selectedNode
.
data
.
selected
=
true
})
})
setNodes
(
newNodes
)
setNodes
(
newNodes
)
},
[
store
])
},
[
store
])
const
handleConnectNode
=
useCallback
<
OnConnect
>
(({
const
handleNodeClick
=
useCallback
<
NodeMouseHandler
>
((
_
,
node
)
=>
{
if
(
useStore
.
getState
().
isDragging
)
return
handleNodeSelect
(
node
.
id
)
},
[
handleNodeSelect
])
const
handleNodeConnect
=
useCallback
<
OnConnect
>
(({
source
,
source
,
sourceHandle
,
sourceHandle
,
target
,
target
,
...
@@ -134,51 +162,31 @@ export const useWorkflow = () => {
...
@@ -134,51 +162,31 @@ export const useWorkflow = () => {
return
filtered
return
filtered
})
})
setEdges
(
newEdges
)
setEdges
(
newEdges
)
handleLayout
()
},
[
store
,
handleLayout
])
const
handleEnterEdge
=
useCallback
<
EdgeMouseHandler
>
((
_
,
edge
)
=>
{
const
{
edges
,
setEdges
,
}
=
store
.
getState
()
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
currentEdge
=
draft
.
find
(
e
=>
e
.
id
===
edge
.
id
)
!
currentEdge
.
data
=
{
...
currentEdge
.
data
,
hovering
:
true
}
})
setEdges
(
newEdges
)
},
[
store
])
},
[
store
])
const
handle
LeaveEdge
=
useCallback
<
EdgeMouseHandler
>
((
_
,
edge
)
=>
{
const
handle
NodeDelete
=
useCallback
((
nodeId
:
string
)
=>
{
const
{
const
{
getNodes
,
setNodes
,
edges
,
edges
,
setEdges
,
setEdges
,
}
=
store
.
getState
()
}
=
store
.
getState
()
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
currentEdge
=
draft
.
find
(
e
=>
e
.
id
===
edge
.
id
)
!
currentEdge
.
data
=
{
...
currentEdge
.
data
,
hovering
:
false
}
})
setEdges
(
newEdges
)
},
[
store
])
const
handleDeleteEdge
=
useCallback
(()
=>
{
const
newNodes
=
produce
(
getNodes
(),
(
draft
)
=>
{
const
{
const
index
=
draft
.
findIndex
(
node
=>
node
.
id
===
nodeId
)
edges
,
setEdges
,
}
=
store
.
getState
()
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
index
=
draft
.
findIndex
(
edge
=>
edge
.
selected
)
if
(
index
>
-
1
)
if
(
index
>
-
1
)
draft
.
splice
(
index
,
1
)
draft
.
splice
(
index
,
1
)
})
})
setNodes
(
newNodes
)
const
connectedEdges
=
getConnectedEdges
([{
id
:
nodeId
}
as
Node
],
edges
)
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
return
draft
.
filter
(
edge
=>
!
connectedEdges
.
find
(
connectedEdge
=>
connectedEdge
.
id
===
edge
.
id
))
})
setEdges
(
newEdges
)
setEdges
(
newEdges
)
handleLayout
()
},
[
store
])
},
[
store
,
handleLayout
])
const
handle
UpdateNodeData
=
useCallback
(({
id
,
data
}:
SelectedNode
)
=>
{
const
handle
NodeDataUpdate
=
useCallback
(({
id
,
data
}:
SelectedNode
)
=>
{
const
{
const
{
getNodes
,
getNodes
,
setNodes
,
setNodes
,
...
@@ -191,7 +199,7 @@ export const useWorkflow = () => {
...
@@ -191,7 +199,7 @@ export const useWorkflow = () => {
setNodes
(
newNodes
)
setNodes
(
newNodes
)
},
[
store
])
},
[
store
])
const
handle
AddNextNode
=
useCallback
((
currentNodeId
:
string
,
nodeType
:
BlockEnum
,
sourceHandle
:
string
)
=>
{
const
handle
NodeAddNext
=
useCallback
((
currentNodeId
:
string
,
nodeType
:
BlockEnum
,
sourceHandle
:
string
)
=>
{
const
{
const
{
getNodes
,
getNodes
,
setNodes
,
setNodes
,
...
@@ -203,12 +211,14 @@ export const useWorkflow = () => {
...
@@ -203,12 +211,14 @@ export const useWorkflow = () => {
const
nextNode
:
Node
=
{
const
nextNode
:
Node
=
{
id
:
`
${
Date
.
now
()}
`
,
id
:
`
${
Date
.
now
()}
`
,
type
:
'custom'
,
type
:
'custom'
,
data
:
NodeInitialData
[
nodeType
],
data
:
{
...
NodeInitialData
[
nodeType
],
selected
:
true
,
},
position
:
{
position
:
{
x
:
currentNode
.
position
.
x
+
304
,
x
:
currentNode
.
position
.
x
+
304
,
y
:
currentNode
.
position
.
y
,
y
:
currentNode
.
position
.
y
,
},
},
selected
:
true
,
}
}
const
newEdge
=
{
const
newEdge
=
{
id
:
`
${
currentNode
.
id
}
-
${
nextNode
.
id
}
`
,
id
:
`
${
currentNode
.
id
}
-
${
nextNode
.
id
}
`
,
...
@@ -220,7 +230,7 @@ export const useWorkflow = () => {
...
@@ -220,7 +230,7 @@ export const useWorkflow = () => {
}
}
const
newNodes
=
produce
(
nodes
,
(
draft
)
=>
{
const
newNodes
=
produce
(
nodes
,
(
draft
)
=>
{
draft
.
forEach
((
node
)
=>
{
draft
.
forEach
((
node
)
=>
{
node
.
selected
=
false
node
.
data
.
selected
=
false
})
})
draft
.
push
(
nextNode
)
draft
.
push
(
nextNode
)
})
})
...
@@ -231,7 +241,7 @@ export const useWorkflow = () => {
...
@@ -231,7 +241,7 @@ export const useWorkflow = () => {
setEdges
(
newEdges
)
setEdges
(
newEdges
)
},
[
store
])
},
[
store
])
const
handle
ChangeCurrentNod
e
=
useCallback
((
currentNodeId
:
string
,
nodeType
:
BlockEnum
,
sourceHandle
?:
string
)
=>
{
const
handle
NodeChang
e
=
useCallback
((
currentNodeId
:
string
,
nodeType
:
BlockEnum
,
sourceHandle
?:
string
)
=>
{
const
{
const
{
getNodes
,
getNodes
,
setNodes
,
setNodes
,
...
@@ -279,40 +289,64 @@ export const useWorkflow = () => {
...
@@ -279,40 +289,64 @@ export const useWorkflow = () => {
}
}
},
[
store
])
},
[
store
])
const
handle
DeleteNode
=
useCallback
((
nodeId
:
string
)
=>
{
const
handle
EdgeEnter
=
useCallback
<
EdgeMouseHandler
>
((
_
,
edge
)
=>
{
const
{
const
{
getNodes
,
setNodes
,
edges
,
edges
,
setEdges
,
setEdges
,
}
=
store
.
getState
()
}
=
store
.
getState
()
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
currentEdge
=
draft
.
find
(
e
=>
e
.
id
===
edge
.
id
)
!
const
newNodes
=
produce
(
getNodes
(),
(
draft
)
=>
{
currentEdge
.
data
=
{
...
currentEdge
.
data
,
hovering
:
true
}
const
index
=
draft
.
findIndex
(
node
=>
node
.
id
===
nodeId
)
})
setEdges
(
newEdges
)
},
[
store
])
if
(
index
>
-
1
)
const
handleEdgeLeave
=
useCallback
<
EdgeMouseHandler
>
((
_
,
edge
)
=>
{
draft
.
splice
(
index
,
1
)
const
{
edges
,
setEdges
,
}
=
store
.
getState
()
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
currentEdge
=
draft
.
find
(
e
=>
e
.
id
===
edge
.
id
)
!
currentEdge
.
data
=
{
...
currentEdge
.
data
,
hovering
:
false
}
})
})
setNodes
(
newNodes
)
setEdges
(
newEdges
)
const
connectedEdges
=
getConnectedEdges
([{
id
:
nodeId
}
as
Node
],
edges
)
},
[
store
])
const
handleEdgeDelete
=
useCallback
(()
=>
{
const
{
edges
,
setEdges
,
}
=
store
.
getState
()
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
const
newEdges
=
produce
(
edges
,
(
draft
)
=>
{
return
draft
.
filter
(
edge
=>
!
connectedEdges
.
find
(
connectedEdge
=>
connectedEdge
.
id
===
edge
.
id
))
const
index
=
draft
.
findIndex
(
edge
=>
edge
.
selected
)
if
(
index
>
-
1
)
draft
.
splice
(
index
,
1
)
})
})
setEdges
(
newEdges
)
setEdges
(
newEdges
)
},
[
store
])
},
[
store
])
return
{
return
{
handleEnterNode
,
handleLeaveNode
,
handleSelectNode
,
handleEnterEdge
,
handleLeaveEdge
,
handleConnectNode
,
handleDeleteEdge
,
handleUpdateNodeData
,
handleAddNextNode
,
handleChangeCurrentNode
,
handleDeleteNode
,
handleLayout
,
handleLayout
,
handleNodeDragStart
,
handleNodeDrag
,
handleNodeDragStop
,
handleNodeEnter
,
handleNodeLeave
,
handleNodeSelect
,
handleNodeClick
,
handleNodeConnect
,
handleNodeDelete
,
handleNodeDataUpdate
,
handleNodeAddNext
,
handleNodeChange
,
handleEdgeEnter
,
handleEdgeLeave
,
handleEdgeDelete
,
}
}
}
}
web/app/components/workflow/index.tsx
View file @
b113711a
import
type
{
FC
}
from
'react'
import
type
{
FC
}
from
'react'
import
{
memo
,
useEffect
}
from
'react'
import
{
memo
,
// useEffect,
}
from
'react'
import
{
useKeyPress
}
from
'ahooks'
import
{
useKeyPress
}
from
'ahooks'
import
ReactFlow
,
{
import
ReactFlow
,
{
Background
,
Background
,
ReactFlowProvider
,
ReactFlowProvider
,
useEdgesState
,
useEdgesState
,
useNodesInitialized
,
//
useNodesInitialized,
useNodesState
,
useNodesState
,
}
from
'reactflow'
}
from
'reactflow'
import
'reactflow/dist/style.css'
import
'reactflow/dist/style.css'
import
'./style.css'
//
import './style.css'
import
type
{
import
type
{
Edge
,
Edge
,
Node
,
Node
,
...
@@ -42,24 +45,32 @@ const Workflow: FC<WorkflowProps> = memo(({
...
@@ -42,24 +45,32 @@ const Workflow: FC<WorkflowProps> = memo(({
const
showFeaturesPanel
=
useStore
(
state
=>
state
.
showFeaturesPanel
)
const
showFeaturesPanel
=
useStore
(
state
=>
state
.
showFeaturesPanel
)
const
[
nodes
]
=
useNodesState
(
initialNodes
)
const
[
nodes
]
=
useNodesState
(
initialNodes
)
const
[
edges
,
_
,
onEdgesChange
]
=
useEdgesState
(
initialEdges
)
const
[
edges
,
_
,
onEdgesChange
]
=
useEdgesState
(
initialEdges
)
const
nodesInitialized
=
useNodesInitialized
()
// const nodesInitialized = useNodesInitialized()
console
.
log
(
nodes
)
const
{
const
{
handleEnterNode
,
// handleLayout,
handleLeaveNode
,
handleConnectNode
,
handleNodeDragStart
,
handleEnterEdge
,
handleNodeDrag
,
handleLeaveEdge
,
handleNodeDragStop
,
handleDeleteEdge
,
handleNodeEnter
,
handleLayout
,
handleNodeLeave
,
handleNodeClick
,
handleNodeConnect
,
handleEdgeEnter
,
handleEdgeLeave
,
handleEdgeDelete
,
}
=
useWorkflow
()
}
=
useWorkflow
()
useEffect
(()
=>
{
//
useEffect(() => {
if
(
nodesInitialized
)
//
if (nodesInitialized)
handleLayout
()
//
handleLayout()
},
[
nodesInitialized
,
handleLayout
])
//
}, [nodesInitialized, handleLayout])
useKeyPress
(
'Backspace'
,
handle
DeleteEdg
e
)
useKeyPress
(
'Backspace'
,
handle
EdgeDelet
e
)
return
(
return
(
<
div
className=
'relative w-full h-full'
>
<
div
className=
'relative w-full h-full'
>
...
@@ -74,11 +85,15 @@ const Workflow: FC<WorkflowProps> = memo(({
...
@@ -74,11 +85,15 @@ const Workflow: FC<WorkflowProps> = memo(({
edgeTypes=
{
edgeTypes
}
edgeTypes=
{
edgeTypes
}
nodes=
{
nodes
}
nodes=
{
nodes
}
edges=
{
edges
}
edges=
{
edges
}
onConnect=
{
handleConnectNode
}
onNodeDragStart=
{
handleNodeDragStart
}
onNodeMouseEnter=
{
handleEnterNode
}
onNodeDrag=
{
handleNodeDrag
}
onNodeMouseLeave=
{
handleLeaveNode
}
onNodeDragStop=
{
handleNodeDragStop
}
onEdgeMouseEnter=
{
handleEnterEdge
}
onNodeMouseEnter=
{
handleNodeEnter
}
onEdgeMouseLeave=
{
handleLeaveEdge
}
onNodeMouseLeave=
{
handleNodeLeave
}
onNodeClick=
{
handleNodeClick
}
onConnect=
{
handleNodeConnect
}
onEdgeMouseEnter=
{
handleEdgeEnter
}
onEdgeMouseLeave=
{
handleEdgeLeave
}
onEdgesChange=
{
onEdgesChange
}
onEdgesChange=
{
onEdgesChange
}
multiSelectionKeyCode=
{
null
}
multiSelectionKeyCode=
{
null
}
connectionLineComponent=
{
CustomConnectionLine
}
connectionLineComponent=
{
CustomConnectionLine
}
...
...
web/app/components/workflow/nodes/_base/components/next-step/add.tsx
View file @
b113711a
...
@@ -17,11 +17,11 @@ const Add = ({
...
@@ -17,11 +17,11 @@ const Add = ({
sourceHandle
,
sourceHandle
,
branchName
,
branchName
,
}:
AddProps
)
=>
{
}:
AddProps
)
=>
{
const
{
handle
AddNextNode
}
=
useWorkflow
()
const
{
handle
NodeAddNext
}
=
useWorkflow
()
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
handle
AddNextNode
(
nodeId
,
type
,
sourceHandle
)
handle
NodeAddNext
(
nodeId
,
type
,
sourceHandle
)
},
[
nodeId
,
sourceHandle
,
handle
AddNextNode
])
},
[
nodeId
,
sourceHandle
,
handle
NodeAddNext
])
const
renderTrigger
=
useCallback
((
open
:
boolean
)
=>
{
const
renderTrigger
=
useCallback
((
open
:
boolean
)
=>
{
return
(
return
(
...
...
web/app/components/workflow/nodes/_base/components/next-step/index.tsx
View file @
b113711a
...
@@ -18,7 +18,7 @@ const NextStep = ({
...
@@ -18,7 +18,7 @@ const NextStep = ({
selectedNode
,
selectedNode
,
}:
NextStepProps
)
=>
{
}:
NextStepProps
)
=>
{
const
store
=
useStoreApi
()
const
store
=
useStoreApi
()
const
branches
=
selectedNode
?.
data
.
b
ranches
const
branches
=
selectedNode
?.
data
.
targetB
ranches
const
edges
=
useEdges
()
const
edges
=
useEdges
()
const
outgoers
=
getOutgoers
(
selectedNode
as
Node
,
store
.
getState
().
getNodes
(),
edges
)
const
outgoers
=
getOutgoers
(
selectedNode
as
Node
,
store
.
getState
().
getNodes
(),
edges
)
const
connectedEdges
=
getConnectedEdges
([
selectedNode
]
as
Node
[],
edges
).
filter
(
edge
=>
edge
.
source
===
selectedNode
!
.
id
)
const
connectedEdges
=
getConnectedEdges
([
selectedNode
]
as
Node
[],
edges
).
filter
(
edge
=>
edge
.
source
===
selectedNode
!
.
id
)
...
...
web/app/components/workflow/nodes/_base/components/next-step/item.tsx
View file @
b113711a
...
@@ -23,10 +23,10 @@ const Item = ({
...
@@ -23,10 +23,10 @@ const Item = ({
branchName
,
branchName
,
data
,
data
,
}:
ItemProps
)
=>
{
}:
ItemProps
)
=>
{
const
{
handle
ChangeCurrentNod
e
}
=
useWorkflow
()
const
{
handle
NodeChang
e
}
=
useWorkflow
()
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
handle
ChangeCurrentNod
e
(
nodeId
,
type
,
sourceHandle
)
handle
NodeChang
e
(
nodeId
,
type
,
sourceHandle
)
},
[
nodeId
,
sourceHandle
,
handle
ChangeCurrentNod
e
])
},
[
nodeId
,
sourceHandle
,
handle
NodeChang
e
])
const
renderTrigger
=
useCallback
((
open
:
boolean
)
=>
{
const
renderTrigger
=
useCallback
((
open
:
boolean
)
=>
{
return
(
return
(
<
Button
<
Button
...
...
web/app/components/workflow/nodes/_base/components/node-handle.tsx
View file @
b113711a
...
@@ -88,7 +88,7 @@ export const NodeSourceHandle = ({
...
@@ -88,7 +88,7 @@ export const NodeSourceHandle = ({
nodeSelectorClassName
,
nodeSelectorClassName
,
}:
NodeHandleProps
)
=>
{
}:
NodeHandleProps
)
=>
{
const
[
open
,
setOpen
]
=
useState
(
false
)
const
[
open
,
setOpen
]
=
useState
(
false
)
const
{
handle
AddNextNode
}
=
useWorkflow
()
const
{
handle
NodeAddNext
}
=
useWorkflow
()
const
edges
=
useEdges
()
const
edges
=
useEdges
()
const
connectedEdges
=
getConnectedEdges
([{
id
}
as
Node
],
edges
)
const
connectedEdges
=
getConnectedEdges
([{
id
}
as
Node
],
edges
)
const
connected
=
connectedEdges
.
find
(
edge
=>
edge
.
sourceHandle
===
handleId
&&
edge
.
source
===
id
)
const
connected
=
connectedEdges
.
find
(
edge
=>
edge
.
sourceHandle
===
handleId
&&
edge
.
source
===
id
)
...
@@ -101,8 +101,8 @@ export const NodeSourceHandle = ({
...
@@ -101,8 +101,8 @@ export const NodeSourceHandle = ({
setOpen
(
v
=>
!
v
)
setOpen
(
v
=>
!
v
)
},
[
connected
])
},
[
connected
])
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
handle
AddNextNode
(
id
,
type
,
handleId
)
handle
NodeAddNext
(
id
,
type
,
handleId
)
},
[
handle
AddNextNode
,
id
,
handleId
])
},
[
handle
NodeAddNext
,
id
,
handleId
])
return
(
return
(
<>
<>
...
...
web/app/components/workflow/nodes/_base/components/panel-operator/change-block.tsx
View file @
b113711a
...
@@ -12,11 +12,11 @@ type ChangeBlockProps = {
...
@@ -12,11 +12,11 @@ type ChangeBlockProps = {
const
ChangeBlock
=
({
const
ChangeBlock
=
({
nodeId
,
nodeId
,
}:
ChangeBlockProps
)
=>
{
}:
ChangeBlockProps
)
=>
{
const
{
handle
ChangeCurrentNod
e
}
=
useWorkflow
()
const
{
handle
NodeChang
e
}
=
useWorkflow
()
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
const
handleSelect
=
useCallback
((
type
:
BlockEnum
)
=>
{
handle
ChangeCurrentNod
e
(
nodeId
,
type
)
handle
NodeChang
e
(
nodeId
,
type
)
},
[
handle
ChangeCurrentNod
e
,
nodeId
])
},
[
handle
NodeChang
e
,
nodeId
])
const
renderTrigger
=
useCallback
(()
=>
{
const
renderTrigger
=
useCallback
(()
=>
{
return
(
return
(
...
...
web/app/components/workflow/nodes/_base/components/panel-operator/index.tsx
View file @
b113711a
...
@@ -17,7 +17,7 @@ type PanelOperatorProps = {
...
@@ -17,7 +17,7 @@ type PanelOperatorProps = {
const
PanelOperator
=
({
const
PanelOperator
=
({
nodeId
,
nodeId
,
}:
PanelOperatorProps
)
=>
{
}:
PanelOperatorProps
)
=>
{
const
{
handle
DeleteNod
e
}
=
useWorkflow
()
const
{
handle
NodeDelet
e
}
=
useWorkflow
()
const
[
open
,
setOpen
]
=
useState
(
false
)
const
[
open
,
setOpen
]
=
useState
(
false
)
return
(
return
(
...
@@ -51,7 +51,7 @@ const PanelOperator = ({
...
@@ -51,7 +51,7 @@ const PanelOperator = ({
<
div
className=
'p-1'
>
<
div
className=
'p-1'
>
<
div
<
div
className=
'flex items-center px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50'
className=
'flex items-center px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50'
onClick=
{
()
=>
handle
DeleteNod
e
(
nodeId
)
}
onClick=
{
()
=>
handle
NodeDelet
e
(
nodeId
)
}
>
>
Delete
Delete
</
div
>
</
div
>
...
...
web/app/components/workflow/nodes/_base/node.tsx
View file @
b113711a
...
@@ -8,7 +8,6 @@ import {
...
@@ -8,7 +8,6 @@ import {
}
from
'react'
}
from
'react'
import
type
{
NodeProps
}
from
'reactflow'
import
type
{
NodeProps
}
from
'reactflow'
import
BlockIcon
from
'../../block-icon'
import
BlockIcon
from
'../../block-icon'
import
{
useWorkflow
}
from
'../../hooks'
type
BaseNodeProps
=
{
type
BaseNodeProps
=
{
children
:
ReactElement
children
:
ReactElement
...
@@ -17,19 +16,15 @@ type BaseNodeProps = {
...
@@ -17,19 +16,15 @@ type BaseNodeProps = {
const
BaseNode
:
FC
<
BaseNodeProps
>
=
({
const
BaseNode
:
FC
<
BaseNodeProps
>
=
({
id
,
id
,
data
,
data
,
selected
,
children
,
children
,
})
=>
{
})
=>
{
const
{
handleSelectNode
}
=
useWorkflow
()
return
(
return
(
<
div
<
div
className=
{
`
className=
{
`
group relative w-[240px] bg-[#fcfdff] rounded-2xl shadow-xs
group relative w-[240px] bg-[#fcfdff] rounded-2xl shadow-xs
hover:shadow-lg
hover:shadow-lg
${selected ? 'border-[2px] border-primary-600' : 'border border-white'}
${
data.
selected ? 'border-[2px] border-primary-600' : 'border border-white'}
`
}
`
}
onClick=
{
()
=>
handleSelectNode
(
id
)
}
>
>
<
div
className=
'flex items-center px-3 pt-3 pb-2'
>
<
div
className=
'flex items-center px-3 pt-3 pb-2'
>
<
BlockIcon
<
BlockIcon
...
...
web/app/components/workflow/nodes/_base/panel.tsx
View file @
b113711a
...
@@ -34,15 +34,15 @@ const BasePanel: FC<BasePanelProps> = ({
...
@@ -34,15 +34,15 @@ const BasePanel: FC<BasePanelProps> = ({
children
,
children
,
})
=>
{
})
=>
{
const
{
const
{
handle
SelectNode
,
handle
NodeSelect
,
handle
UpdateNodeData
,
handle
NodeDataUpdate
,
}
=
useWorkflow
()
}
=
useWorkflow
()
const
handleTitleChange
=
useCallback
((
title
:
string
)
=>
{
const
handleTitleChange
=
useCallback
((
title
:
string
)
=>
{
handle
UpdateNodeData
({
id
,
data
:
{
...
data
,
title
}
})
handle
NodeDataUpdate
({
id
,
data
:
{
...
data
,
title
}
})
},
[
handle
UpdateNodeData
,
id
,
data
])
},
[
handle
NodeDataUpdate
,
id
,
data
])
const
handleDescriptionChange
=
useCallback
((
desc
:
string
)
=>
{
const
handleDescriptionChange
=
useCallback
((
desc
:
string
)
=>
{
handle
UpdateNodeData
({
id
,
data
:
{
...
data
,
desc
}
})
handle
NodeDataUpdate
({
id
,
data
:
{
...
data
,
desc
}
})
},
[
handle
UpdateNodeData
,
id
,
data
])
},
[
handle
NodeDataUpdate
,
id
,
data
])
return
(
return
(
<
div
className=
'mr-2 w-[420px] h-full bg-white shadow-lg border-[0.5px] border-gray-200 rounded-2xl overflow-y-auto'
>
<
div
className=
'mr-2 w-[420px] h-full bg-white shadow-lg border-[0.5px] border-gray-200 rounded-2xl overflow-y-auto'
>
...
@@ -73,7 +73,7 @@ const BasePanel: FC<BasePanelProps> = ({
...
@@ -73,7 +73,7 @@ const BasePanel: FC<BasePanelProps> = ({
<
div
className=
'mx-3 w-[1px] h-3.5 bg-gray-200'
/>
<
div
className=
'mx-3 w-[1px] h-3.5 bg-gray-200'
/>
<
div
<
div
className=
'flex items-center justify-center w-6 h-6 cursor-pointer'
className=
'flex items-center justify-center w-6 h-6 cursor-pointer'
onClick=
{
()
=>
handle
SelectNode
(
id
,
true
)
}
onClick=
{
()
=>
handle
NodeSelect
(
id
,
true
)
}
>
>
<
XClose
className=
'w-4 h-4'
/>
<
XClose
className=
'w-4 h-4'
/>
</
div
>
</
div
>
...
...
web/app/components/workflow/panel/index.tsx
View file @
b113711a
...
@@ -16,7 +16,7 @@ const Panel: FC = () => {
...
@@ -16,7 +16,7 @@ const Panel: FC = () => {
const
mode
=
useStore
(
state
=>
state
.
mode
)
const
mode
=
useStore
(
state
=>
state
.
mode
)
const
runStaus
=
useStore
(
state
=>
state
.
runStaus
)
const
runStaus
=
useStore
(
state
=>
state
.
runStaus
)
const
nodes
=
useNodes
<
CommonNodeType
>
()
const
nodes
=
useNodes
<
CommonNodeType
>
()
const
selectedNode
=
nodes
.
find
(
node
=>
node
.
selected
)
const
selectedNode
=
nodes
.
find
(
node
=>
node
.
data
.
selected
)
const
showRunHistory
=
useStore
(
state
=>
state
.
showRunHistory
)
const
showRunHistory
=
useStore
(
state
=>
state
.
showRunHistory
)
const
{
const
{
showWorkflowInfoPanel
,
showWorkflowInfoPanel
,
...
...
web/app/components/workflow/store.ts
View file @
b113711a
...
@@ -5,12 +5,14 @@ type State = {
...
@@ -5,12 +5,14 @@ type State = {
showRunHistory
:
boolean
showRunHistory
:
boolean
showFeaturesPanel
:
boolean
showFeaturesPanel
:
boolean
runStaus
:
string
runStaus
:
string
isDragging
:
boolean
}
}
type
Action
=
{
type
Action
=
{
setShowRunHistory
:
(
showRunHistory
:
boolean
)
=>
void
setShowRunHistory
:
(
showRunHistory
:
boolean
)
=>
void
setShowFeaturesPanel
:
(
showFeaturesPanel
:
boolean
)
=>
void
setShowFeaturesPanel
:
(
showFeaturesPanel
:
boolean
)
=>
void
setRunStaus
:
(
runStaus
:
string
)
=>
void
setRunStaus
:
(
runStaus
:
string
)
=>
void
setIsDragging
:
(
isDragging
:
boolean
)
=>
void
}
}
export
const
useStore
=
create
<
State
&
Action
>
(
set
=>
({
export
const
useStore
=
create
<
State
&
Action
>
(
set
=>
({
...
@@ -21,4 +23,6 @@ export const useStore = create<State & Action>(set => ({
...
@@ -21,4 +23,6 @@ export const useStore = create<State & Action>(set => ({
setShowFeaturesPanel
:
showFeaturesPanel
=>
set
(()
=>
({
showFeaturesPanel
})),
setShowFeaturesPanel
:
showFeaturesPanel
=>
set
(()
=>
({
showFeaturesPanel
})),
runStaus
:
''
,
runStaus
:
''
,
setRunStaus
:
runStaus
=>
set
(()
=>
({
runStaus
})),
setRunStaus
:
runStaus
=>
set
(()
=>
({
runStaus
})),
isDragging
:
false
,
setIsDragging
:
isDragging
=>
set
(()
=>
({
isDragging
})),
}))
}))
web/app/components/workflow/types.ts
View file @
b113711a
...
@@ -28,6 +28,7 @@ export type CommonNodeType = {
...
@@ -28,6 +28,7 @@ export type CommonNodeType = {
x
:
number
x
:
number
y
:
number
y
:
number
}
}
selected
?:
boolean
hovering
?:
boolean
hovering
?:
boolean
targetBranches
?:
Branch
[]
targetBranches
?:
Branch
[]
title
:
string
title
:
string
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment