feat(web): 完成前序节点输出变量注入

This commit is contained in:
v-zhangjc9
2025-07-07 19:50:22 +08:00
parent f523fc7638
commit 3afdff0a05
5 changed files with 82 additions and 33 deletions

View File

@@ -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({