From 129a68bb06031f4db8cb37f659d3685abfb633cf Mon Sep 17 00:00:00 2001 From: StyleZhang Date: Fri, 15 Mar 2024 19:34:31 +0800 Subject: [PATCH] auto layout --- .../workflow/block-selector/index.tsx | 2 +- web/app/components/workflow/constants.ts | 6 +++++- .../components/workflow/hooks/use-workflow.ts | 18 +++++++++++++++--- web/app/components/workflow/utils.ts | 4 +++- 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/web/app/components/workflow/block-selector/index.tsx b/web/app/components/workflow/block-selector/index.tsx index 6b948a86fa..b742f5f1c3 100644 --- a/web/app/components/workflow/block-selector/index.tsx +++ b/web/app/components/workflow/block-selector/index.tsx @@ -99,7 +99,7 @@ const NodeSelector: FC = ({ } -
+
{ export const useWorkflow = () => { const store = useStoreApi() + const reactflow = useReactFlow() const nodesExtraData = useNodesExtraData() + const { handleSyncWorkflowDraft } = useNodesSyncDraft() const handleLayout = useCallback(async () => { const { @@ -51,6 +56,7 @@ export const useWorkflow = () => { edges, setNodes, } = store.getState() + const { setViewport } = reactflow const nodes = getNodes() const layout = getLayoutByDagre(nodes, edges) @@ -58,13 +64,19 @@ export const useWorkflow = () => { draft.forEach((node) => { const nodeWithPosition = layout.node(node.id) node.position = { - x: nodeWithPosition.x, - y: nodeWithPosition.y, + x: nodeWithPosition.x + AUTO_LAYOUT_OFFSET.x, + y: nodeWithPosition.y + AUTO_LAYOUT_OFFSET.y, } }) }) setNodes(newNodes) - }, [store]) + setViewport({ + x: 0, + y: 0, + zoom: 0.8, + }) + setTimeout(() => handleSyncWorkflowDraft()) + }, [store, reactflow, handleSyncWorkflowDraft]) const getTreeLeafNodes = useCallback((nodeId: string) => { const { diff --git a/web/app/components/workflow/utils.ts b/web/app/components/workflow/utils.ts index 0c733a74f0..8281164f9c 100644 --- a/web/app/components/workflow/utils.ts +++ b/web/app/components/workflow/utils.ts @@ -146,10 +146,12 @@ export const getNodesPositionMap = (nodes: Node[], edges: Edge[]) => { return positionMap } +const dagreGraph = new dagre.graphlib.Graph() +dagreGraph.setDefaultEdgeLabel(() => ({})) + export const getLayoutByDagre = (originNodes: Node[], originEdges: Edge[]) => { const nodes = cloneDeep(originNodes) const edges = cloneDeep(originEdges) - const dagreGraph = new dagre.graphlib.Graph() dagreGraph.setGraph({ rankdir: 'LR', align: 'UL',