From a430284aa21e3ae1f0d5654e55b2ad2852519cc2 Mon Sep 17 00:00:00 2001 From: wwf <yearningwang@iqtogether.com> Date: 星期三, 04 六月 2025 15:17:49 +0800 Subject: [PATCH] 初始化 --- app/components/workflow/hooks/use-workflow-interactions.ts | 155 ++++++++++++--------------------------------------- 1 files changed, 36 insertions(+), 119 deletions(-) diff --git a/app/components/workflow/hooks/use-workflow-interactions.ts b/app/components/workflow/hooks/use-workflow-interactions.ts index 636d3b9..b39a3d8 100644 --- a/app/components/workflow/hooks/use-workflow-interactions.ts +++ b/app/components/workflow/hooks/use-workflow-interactions.ts @@ -8,15 +8,12 @@ import { useStore, useWorkflowStore } from '../store' import { CUSTOM_NODE, DSL_EXPORT_CHECK, - NODE_LAYOUT_HORIZONTAL_PADDING, - NODE_LAYOUT_VERTICAL_PADDING, WORKFLOW_DATA_UPDATE, } from '../constants' import type { Node, WorkflowDataUpdater } from '../types' -import { BlockEnum, ControlMode } from '../types' +import { ControlMode } from '../types' import { getLayoutByDagre, - getLayoutForChildNodes, initialEdges, initialNodes, } from '../utils' @@ -25,8 +22,8 @@ useSelectionInteractions, useWorkflowReadOnly, } from '../hooks' -import { useEdgesInteractionsWithoutSync } from './use-edges-interactions-without-sync' -import { useNodesInteractionsWithoutSync } from './use-nodes-interactions-without-sync' +import { useEdgesInteractions } from './use-edges-interactions' +import { useNodesInteractions } from './use-nodes-interactions' import { useNodesSyncDraft } from './use-nodes-sync-draft' import { WorkflowHistoryEvent, useWorkflowHistory } from './use-workflow-history' import { useEventEmitterContextContext } from '@/context/event-emitter' @@ -37,8 +34,8 @@ export const useWorkflowInteractions = () => { const workflowStore = useWorkflowStore() - const { handleNodeCancelRunningStatus } = useNodesInteractionsWithoutSync() - const { handleEdgeCancelRunningStatus } = useEdgesInteractionsWithoutSync() + const { handleNodeCancelRunningStatus } = useNodesInteractions() + const { handleEdgeCancelRunningStatus } = useEdgesInteractions() const handleCancelDebugAndPreviewPanel = useCallback(() => { workflowStore.setState({ @@ -101,81 +98,10 @@ } = store.getState() const { setViewport } = reactflow const nodes = getNodes() - - const loopAndIterationNodes = nodes.filter( - node => (node.data.type === BlockEnum.Loop || node.data.type === BlockEnum.Iteration) - && !node.parentId - && node.type === CUSTOM_NODE, - ) - - const childLayoutsMap: Record<string, any> = {} - loopAndIterationNodes.forEach((node) => { - childLayoutsMap[node.id] = getLayoutForChildNodes(node.id, nodes, edges) - }) - - const containerSizeChanges: Record<string, { width: number, height: number }> = {} - - loopAndIterationNodes.forEach((parentNode) => { - const childLayout = childLayoutsMap[parentNode.id] - if (!childLayout) return - - let minX = Infinity - let minY = Infinity - let maxX = -Infinity - let maxY = -Infinity - let hasChildren = false - - const childNodes = nodes.filter(node => node.parentId === parentNode.id) - - childNodes.forEach((node) => { - if (childLayout.node(node.id)) { - hasChildren = true - const childNodeWithPosition = childLayout.node(node.id) - - const nodeX = childNodeWithPosition.x - node.width! / 2 - const nodeY = childNodeWithPosition.y - node.height! / 2 - - minX = Math.min(minX, nodeX) - minY = Math.min(minY, nodeY) - maxX = Math.max(maxX, nodeX + node.width!) - maxY = Math.max(maxY, nodeY + node.height!) - } - }) - - if (hasChildren) { - const requiredWidth = maxX - minX + NODE_LAYOUT_HORIZONTAL_PADDING * 2 - const requiredHeight = maxY - minY + NODE_LAYOUT_VERTICAL_PADDING * 2 - - containerSizeChanges[parentNode.id] = { - width: Math.max(parentNode.width || 0, requiredWidth), - height: Math.max(parentNode.height || 0, requiredHeight), - } - } - }) - - const nodesWithUpdatedSizes = produce(nodes, (draft) => { - draft.forEach((node) => { - if ((node.data.type === BlockEnum.Loop || node.data.type === BlockEnum.Iteration) - && containerSizeChanges[node.id]) { - node.width = containerSizeChanges[node.id].width - node.height = containerSizeChanges[node.id].height - - if (node.data.type === BlockEnum.Loop) { - node.data.width = containerSizeChanges[node.id].width - node.data.height = containerSizeChanges[node.id].height - } - else if (node.data.type === BlockEnum.Iteration) { - node.data.width = containerSizeChanges[node.id].width - node.data.height = containerSizeChanges[node.id].height - } - } - }) - }) - - const layout = getLayoutByDagre(nodesWithUpdatedSizes, edges) - + const layout = getLayoutByDagre(nodes, edges) const rankMap = {} as Record<string, Node> - nodesWithUpdatedSizes.forEach((node) => { + + nodes.forEach((node) => { if (!node.parentId && node.type === CUSTOM_NODE) { const rank = layout.node(node.id).rank! @@ -189,7 +115,7 @@ } }) - const newNodes = produce(nodesWithUpdatedSizes, (draft) => { + const newNodes = produce(nodes, (draft) => { draft.forEach((node) => { if (!node.parentId && node.type === CUSTOM_NODE) { const nodeWithPosition = layout.node(node.id) @@ -200,40 +126,7 @@ } } }) - - loopAndIterationNodes.forEach((parentNode) => { - const childLayout = childLayoutsMap[parentNode.id] - if (!childLayout) return - - const childNodes = draft.filter(node => node.parentId === parentNode.id) - - let minX = Infinity - let minY = Infinity - - childNodes.forEach((node) => { - if (childLayout.node(node.id)) { - const childNodeWithPosition = childLayout.node(node.id) - const nodeX = childNodeWithPosition.x - node.width! / 2 - const nodeY = childNodeWithPosition.y - node.height! / 2 - - minX = Math.min(minX, nodeX) - minY = Math.min(minY, nodeY) - } - }) - - childNodes.forEach((node) => { - if (childLayout.node(node.id)) { - const childNodeWithPosition = childLayout.node(node.id) - - node.position = { - x: NODE_LAYOUT_HORIZONTAL_PADDING + (childNodeWithPosition.x - node.width! / 2 - minX), - y: NODE_LAYOUT_VERTICAL_PADDING + (childNodeWithPosition.y - node.height! / 2 - minY), - } - } - }) - }) }) - setNodes(newNodes) const zoom = 0.7 setViewport({ @@ -246,7 +139,6 @@ handleSyncWorkflowDraft() }) }, [getNodesReadOnly, store, reactflow, workflowStore, handleSyncWorkflowDraft, saveStateToHistory]) - return { handleLayout, } @@ -313,6 +205,7 @@ export const useWorkflowUpdate = () => { const reactflow = useReactFlow() + const workflowStore = useWorkflowStore() const { eventEmitter } = useEventEmitterContextContext() const handleUpdateWorkflowCanvas = useCallback((payload: WorkflowDataUpdater) => { @@ -332,8 +225,32 @@ setViewport(viewport) }, [eventEmitter, reactflow]) + const handleRefreshWorkflowDraft = useCallback(() => { + const { + appId, + setSyncWorkflowDraftHash, + setIsSyncingWorkflowDraft, + setEnvironmentVariables, + setEnvSecrets, + setConversationVariables, + } = workflowStore.getState() + setIsSyncingWorkflowDraft(true) + fetchWorkflowDraft(`/apps/${appId}/workflows/draft`).then((response) => { + handleUpdateWorkflowCanvas(response.graph as WorkflowDataUpdater) + setSyncWorkflowDraftHash(response.hash) + setEnvSecrets((response.environment_variables || []).filter(env => env.value_type === 'secret').reduce((acc, env) => { + acc[env.id] = env.value + return acc + }, {} as Record<string, string>)) + setEnvironmentVariables(response.environment_variables?.map(env => env.value_type === 'secret' ? { ...env, value: '[__HIDDEN__]' } : env) || []) + // #TODO chatVar sync# + setConversationVariables(response.conversation_variables || []) + }).finally(() => setIsSyncingWorkflowDraft(false)) + }, [handleUpdateWorkflowCanvas, workflowStore]) + return { handleUpdateWorkflowCanvas, + handleRefreshWorkflowDraft, } } @@ -366,7 +283,7 @@ a.download = `${appDetail.name}.yml` a.click() } - catch { + catch (e) { notify({ type: 'error', message: t('app.exportFailed') }) } finally { @@ -391,7 +308,7 @@ }, } as any) } - catch { + catch (e) { notify({ type: 'error', message: t('app.exportFailed') }) } }, [appDetail, eventEmitter, handleExportDSL, notify, t]) -- Gitblit v1.8.0