feat(web): 完成前序节点输出变量注入
This commit is contained in:
@@ -3,12 +3,14 @@ import {
|
||||
applyEdgeChanges,
|
||||
applyNodeChanges,
|
||||
type Edge,
|
||||
getIncomers,
|
||||
type Node,
|
||||
type OnConnect,
|
||||
type OnEdgesChange,
|
||||
type OnNodesChange,
|
||||
} from '@xyflow/react'
|
||||
import {filter, find, isEqual} from 'licia'
|
||||
import {filter, find, isEqual, unique} from 'licia'
|
||||
import Queue from 'yocto-queue'
|
||||
import {create} from 'zustand/react'
|
||||
|
||||
export type FlowStoreState = {
|
||||
@@ -16,6 +18,7 @@ export type FlowStoreState = {
|
||||
getNodes: () => Node[],
|
||||
onNodesChange: OnNodesChange,
|
||||
getNodeById: (id: string) => Node | undefined,
|
||||
getAllIncomerNodeById: (id: string) => Node[],
|
||||
addNode: (node: Node) => void,
|
||||
removeNode: (id: string) => void,
|
||||
setNodes: (nodes: Node[]) => void,
|
||||
@@ -37,6 +40,21 @@ export const useFlowStore = create<FlowStoreState>((set, get) => ({
|
||||
})
|
||||
},
|
||||
getNodeById: (id: string) => find(get().nodes, node => isEqual(node.id, id)),
|
||||
getAllIncomerNodeById: (id: string) => {
|
||||
let nodes = get().nodes
|
||||
let edges = get().edges
|
||||
let queue = new Queue<Node>()
|
||||
queue.enqueue(find(nodes, node => isEqual(node.id, id))!)
|
||||
let result: Node[] = []
|
||||
while (queue.size !== 0) {
|
||||
let currentNode = queue.dequeue()!
|
||||
for (const incomer of getIncomers(currentNode, nodes, edges)) {
|
||||
result.push(incomer)
|
||||
queue.enqueue(incomer)
|
||||
}
|
||||
}
|
||||
return unique(result, (a, b) => isEqual(a.id, b.id))
|
||||
},
|
||||
addNode: node => set({nodes: get().nodes.concat(node)}),
|
||||
removeNode: id => {
|
||||
set({
|
||||
|
||||
Reference in New Issue
Block a user