From d641c845dd5052dd716637de51f729f9194f7e37 Mon Sep 17 00:00:00 2001 From: zhsama Date: Thu, 15 Jan 2026 17:12:30 +0800 Subject: [PATCH] feat: Pass workflow draft sync callback to sub-graph --- .../sub-graph/components/sub-graph-main.tsx | 29 ++++++++++++++++--- web/app/components/sub-graph/index.tsx | 2 ++ web/app/components/sub-graph/types.ts | 14 +++++++++ .../tool/components/sub-graph-modal/index.tsx | 6 +++- .../sub-graph-modal/sub-graph-canvas.tsx | 4 +++ .../tool/components/sub-graph-modal/types.ts | 4 +++ 6 files changed, 54 insertions(+), 5 deletions(-) diff --git a/web/app/components/sub-graph/components/sub-graph-main.tsx b/web/app/components/sub-graph/components/sub-graph-main.tsx index 53162dde36..2dc93f881e 100644 --- a/web/app/components/sub-graph/components/sub-graph-main.tsx +++ b/web/app/components/sub-graph/components/sub-graph-main.tsx @@ -1,5 +1,6 @@ import type { FC } from 'react' import type { Viewport } from 'reactflow' +import type { SyncWorkflowDraft, SyncWorkflowDraftCallback } from '../types' import type { Shape as HooksStoreShape } from '@/app/components/workflow/hooks-store' import type { MentionConfig } from '@/app/components/workflow/nodes/_base/types' import type { Edge, Node } from '@/app/components/workflow/types' @@ -22,6 +23,7 @@ type SubGraphMainProps = { mentionConfig: MentionConfig onMentionConfigChange: (config: MentionConfig) => void onSave?: (nodes: Node[], edges: Edge[]) => void + onSyncWorkflowDraft?: SyncWorkflowDraft } const SubGraphMain: FC = ({ @@ -34,6 +36,7 @@ const SubGraphMain: FC = ({ mentionConfig, onMentionConfigChange, onSave, + onSyncWorkflowDraft, }) => { const reactFlowStore = useStoreApi() const availableNodesMetaData = useAvailableNodesMetaData() @@ -53,17 +56,35 @@ const SubGraphMain: FC = ({ onSave?.(getNodes() as Node[], edges as Edge[]) }, [onSave, reactFlowStore]) + const handleSyncWorkflowDraft = useCallback(async ( + notRefreshWhenSyncError?: boolean, + callback?: SyncWorkflowDraftCallback, + ) => { + handleSyncSubGraphDraft() + if (onSyncWorkflowDraft) { + await onSyncWorkflowDraft(notRefreshWhenSyncError, callback) + return + } + try { + callback?.onSuccess?.() + } + catch { + callback?.onError?.() + } + finally { + callback?.onSettled?.() + } + }, [handleSyncSubGraphDraft, onSyncWorkflowDraft]) + const hooksStore = useMemo(() => ({ interactionMode: 'subgraph', availableNodesMetaData, configsMap, fetchInspectVars, ...inspectVarsCrud, - doSyncWorkflowDraft: async () => { - handleSyncSubGraphDraft() - }, + doSyncWorkflowDraft: handleSyncWorkflowDraft, syncWorkflowDraftWhenPageClose: handleSyncSubGraphDraft, - }), [availableNodesMetaData, configsMap, fetchInspectVars, handleSyncSubGraphDraft, inspectVarsCrud]) + }), [availableNodesMetaData, configsMap, fetchInspectVars, handleSyncSubGraphDraft, handleSyncWorkflowDraft, inspectVarsCrud]) return ( = (props) => { parentAvailableVars, configsMap, onSave, + onSyncWorkflowDraft, } = props const setParentAvailableVars = useStore(state => state.setParentAvailableVars) @@ -192,6 +193,7 @@ const SubGraphContent: FC = (props) => { mentionConfig={mentionConfig} onMentionConfigChange={onMentionConfigChange} onSave={onSave} + onSyncWorkflowDraft={onSyncWorkflowDraft} /> ) diff --git a/web/app/components/sub-graph/types.ts b/web/app/components/sub-graph/types.ts index fc98101a08..2ffd7f91eb 100644 --- a/web/app/components/sub-graph/types.ts +++ b/web/app/components/sub-graph/types.ts @@ -1,14 +1,27 @@ import type { StateCreator } from 'zustand' +import type { Shape as HooksStoreShape } from '@/app/components/workflow/hooks-store' import type { MentionConfig } from '@/app/components/workflow/nodes/_base/types' import type { LLMNodeType } from '@/app/components/workflow/nodes/llm/types' import type { Edge, Node, NodeOutPutVar, ValueSelector } from '@/app/components/workflow/types' +export type SyncWorkflowDraftCallback = { + onSuccess?: () => void + onError?: () => void + onSettled?: () => void +} + +export type SyncWorkflowDraft = ( + notRefreshWhenSyncError?: boolean, + callback?: SyncWorkflowDraftCallback, +) => Promise + export type SubGraphProps = { toolNodeId: string paramKey: string sourceVariable: ValueSelector agentNodeId: string agentName: string + configsMap?: HooksStoreShape['configsMap'] mentionConfig: MentionConfig onMentionConfigChange: (config: MentionConfig) => void extractorNode?: Node @@ -16,6 +29,7 @@ export type SubGraphProps = { parentAvailableNodes?: Node[] parentAvailableVars?: NodeOutPutVar[] onSave?: (nodes: Node[], edges: Edge[]) => void + onSyncWorkflowDraft?: SyncWorkflowDraft } export type SubGraphSliceShape = { diff --git a/web/app/components/workflow/nodes/tool/components/sub-graph-modal/index.tsx b/web/app/components/workflow/nodes/tool/components/sub-graph-modal/index.tsx index 74dd99a0c1..48e000c414 100644 --- a/web/app/components/workflow/nodes/tool/components/sub-graph-modal/index.tsx +++ b/web/app/components/workflow/nodes/tool/components/sub-graph-modal/index.tsx @@ -13,6 +13,7 @@ import { useTranslation } from 'react-i18next' import { useStore as useReactFlowStore, useStoreApi } from 'reactflow' import { Agent } from '@/app/components/base/icons/src/vender/workflow' import { useIsChatMode, useNodesSyncDraft, useWorkflow, useWorkflowVariables } from '@/app/components/workflow/hooks' +import { useHooksStore } from '@/app/components/workflow/hooks-store' import { VarKindType } from '@/app/components/workflow/nodes/_base/types' import { useStore as useWorkflowStore } from '@/app/components/workflow/store' import { BlockEnum, EditionType, PromptRole } from '@/app/components/workflow/types' @@ -32,7 +33,8 @@ const SubGraphModal: FC = ({ const workflowNodes = useWorkflowStore(state => state.nodes) const workflowEdges = useReactFlowStore(state => state.edges) const setControlPromptEditorRerenderKey = useWorkflowStore(state => state.setControlPromptEditorRerenderKey) - const { handleSyncWorkflowDraft } = useNodesSyncDraft() + const { handleSyncWorkflowDraft, doSyncWorkflowDraft } = useNodesSyncDraft() + const configsMap = useHooksStore(state => state.configsMap) const { getBeforeNodesInSameBranch } = useWorkflow() const { getNodeAvailableVars } = useWorkflowVariables() const isChatMode = useIsChatMode() @@ -234,6 +236,7 @@ const SubGraphModal: FC = ({ sourceVariable={sourceVariable} agentNodeId={agentNodeId} agentName={agentName} + configsMap={configsMap} mentionConfig={mentionConfig} onMentionConfigChange={handleMentionConfigChange} extractorNode={extractorNode} @@ -241,6 +244,7 @@ const SubGraphModal: FC = ({ parentAvailableNodes={parentAgentNodes} parentAvailableVars={parentAvailableVars} onSave={handleSave} + onSyncWorkflowDraft={doSyncWorkflowDraft} /> diff --git a/web/app/components/workflow/nodes/tool/components/sub-graph-modal/sub-graph-canvas.tsx b/web/app/components/workflow/nodes/tool/components/sub-graph-modal/sub-graph-canvas.tsx index 04a19c88fc..c8f3b59708 100644 --- a/web/app/components/workflow/nodes/tool/components/sub-graph-modal/sub-graph-canvas.tsx +++ b/web/app/components/workflow/nodes/tool/components/sub-graph-modal/sub-graph-canvas.tsx @@ -10,6 +10,7 @@ const SubGraphCanvas: FC = ({ sourceVariable, agentNodeId, agentName, + configsMap, mentionConfig, onMentionConfigChange, extractorNode, @@ -17,6 +18,7 @@ const SubGraphCanvas: FC = ({ parentAvailableNodes, parentAvailableVars, onSave, + onSyncWorkflowDraft, }) => { return (
@@ -26,6 +28,7 @@ const SubGraphCanvas: FC = ({ sourceVariable={sourceVariable} agentNodeId={agentNodeId} agentName={agentName} + configsMap={configsMap} mentionConfig={mentionConfig} onMentionConfigChange={onMentionConfigChange} extractorNode={extractorNode} @@ -33,6 +36,7 @@ const SubGraphCanvas: FC = ({ parentAvailableNodes={parentAvailableNodes} parentAvailableVars={parentAvailableVars} onSave={onSave} + onSyncWorkflowDraft={onSyncWorkflowDraft} />
) diff --git a/web/app/components/workflow/nodes/tool/components/sub-graph-modal/types.ts b/web/app/components/workflow/nodes/tool/components/sub-graph-modal/types.ts index ae9e227458..a6ed7b9a8f 100644 --- a/web/app/components/workflow/nodes/tool/components/sub-graph-modal/types.ts +++ b/web/app/components/workflow/nodes/tool/components/sub-graph-modal/types.ts @@ -1,3 +1,5 @@ +import type { SyncWorkflowDraft } from '@/app/components/sub-graph/types' +import type { Shape as HooksStoreShape } from '@/app/components/workflow/hooks-store' import type { MentionConfig } from '@/app/components/workflow/nodes/_base/types' import type { LLMNodeType } from '@/app/components/workflow/nodes/llm/types' import type { NodeOutPutVar, Edge as WorkflowEdge, Node as WorkflowNode } from '@/app/components/workflow/types' @@ -20,6 +22,7 @@ export type SubGraphCanvasProps = { sourceVariable: WorkflowValueSelector agentNodeId: string agentName: string + configsMap?: HooksStoreShape['configsMap'] mentionConfig: MentionConfig onMentionConfigChange: (config: MentionConfig) => void extractorNode?: WorkflowNode @@ -27,4 +30,5 @@ export type SubGraphCanvasProps = { parentAvailableNodes?: WorkflowNode[] parentAvailableVars?: NodeOutPutVar[] onSave?: (nodes: WorkflowNode[], edges: WorkflowEdge[]) => void + onSyncWorkflowDraft?: SyncWorkflowDraft }