1010 * Contributors:
1111 * Obeo - initial API and implementation
1212 *******************************************************************************/
13- import { Edge , Node , useReactFlow } from '@xyflow/react' ;
13+ import { Edge , Node , useReactFlow , useUpdateNodeInternals } from '@xyflow/react' ;
1414import { LayoutOptions } from 'elkjs/lib/elk-api' ;
1515import { EdgeData , NodeData } from '../../DiagramRenderer.types' ;
1616import { useFitView } from '../../fit-to-screen/useFitView' ;
17- import { DiagramNodeType } from '../../node/NodeTypes.types' ;
18- import { useOverlap } from '../../overlap/useOverlap' ;
1917import { useElkLayout } from '../elk/useElkLayout' ;
2018import { RawDiagram } from '../layout.types' ;
2119import { useLayout } from '../useLayout' ;
@@ -26,60 +24,49 @@ export const useArrangeAll = (): UseArrangeAllValue => {
2624 const { getNodes, getEdges, setNodes, setEdges } = useReactFlow < Node < NodeData > , Edge < EdgeData > > ( ) ;
2725 const { layout } = useLayout ( ) ;
2826 const { synchronizeLayoutData } = useSynchronizeLayoutData ( ) ;
29- const { resolveNodeOverlap } = useOverlap ( ) ;
27+ const updateNodeInternals = useUpdateNodeInternals ( ) ;
3028 const { fitView } = useFitView ( ) ;
3129 const { elkLayout } = useElkLayout ( ) ;
3230
3331 const arrangeAll = async ( layoutOptions : LayoutOptions ) : Promise < void > => {
3432 await elkLayout ( getNodes ( ) , getEdges ( ) , layoutOptions ) . then (
3533 async ( laidOutNodesWithElk : Node < NodeData , string > [ ] ) => {
36- const laidOutMovedNodeIds = laidOutNodesWithElk
37- . filter ( ( node ) => ! node . data . isBorderNode && ! node . data . pinned )
38- . map ( ( node ) => node . id ) ;
39- const edges = getEdges ( ) ;
40- edges
41- . filter ( ( edge ) => laidOutMovedNodeIds . includes ( edge . source ) || laidOutMovedNodeIds . includes ( edge . target ) )
42- . forEach ( ( edge : Edge < EdgeData , string > ) => {
43- if ( edge . data ?. bendingPoints ) {
44- edge . data . bendingPoints = null ;
45- }
34+ //Removed bending point
35+ const edges = getEdges ( ) . map ( ( edge : Edge < EdgeData , string > ) => {
36+ if ( edge . data ?. bendingPoints ) {
37+ edge . data . bendingPoints = null ;
38+ }
39+ return edge ;
40+ } ) ;
41+ //Removed custom handles for edges
42+ const laidOutNodesWithElkWithoutCustomHandles = laidOutNodesWithElk . map ( ( node ) => {
43+ const handles = node . data . connectionHandles . map ( ( handle ) => {
44+ return {
45+ ...handle ,
46+ XYPosition : null ,
47+ } ;
4648 } ) ;
4749
50+ return {
51+ ...node ,
52+ data : {
53+ ...node . data ,
54+ connectionHandles : handles ,
55+ } ,
56+ } ;
57+ } ) ;
58+
4859 const diagramToLayout : RawDiagram = {
49- nodes : laidOutNodesWithElk ,
50- edges : edges ,
60+ nodes : laidOutNodesWithElkWithoutCustomHandles ,
61+ edges,
5162 } ;
5263 const layoutPromise = new Promise < void > ( ( resolve ) => {
5364 layout ( diagramToLayout , diagramToLayout , null , 'UNDEFINED' , ( laidOutDiagram ) => {
54- const overlapFreeLaidOutNodes : Node < NodeData , string > [ ] = resolveNodeOverlap (
55- laidOutDiagram . nodes . filter ( ( n ) => ! n . data . isBorderNode ) ,
56- 'horizontal'
57- ) as Node < NodeData , DiagramNodeType > [ ] ;
58- laidOutNodesWithElk . map ( ( node ) => {
59- const existingNode = overlapFreeLaidOutNodes . find ( ( laidOutNode ) => laidOutNode . id === node . id ) ;
60- if ( existingNode ) {
61- return {
62- ...node ,
63- position : existingNode . position ,
64- width : existingNode . width ,
65- height : existingNode . height ,
66- style : {
67- ...node . style ,
68- width : `${ existingNode . width } px` ,
69- height : `${ existingNode . height } px` ,
70- } ,
71- } ;
72- }
73- return node ;
74- } ) ;
75- setNodes ( laidOutNodesWithElk ) ;
65+ setNodes ( laidOutDiagram . nodes ) ;
7666 setEdges ( laidOutDiagram . edges ) ;
77- const finalDiagram : RawDiagram = {
78- nodes : laidOutNodesWithElk ,
79- edges : laidOutDiagram . edges ,
80- } ;
81- fitView ( { duration : 200 , nodes : laidOutNodesWithElk } ) ;
82- synchronizeLayoutData ( crypto . randomUUID ( ) , 'layout' , finalDiagram ) ;
67+ fitView ( { duration : 200 , nodes : laidOutDiagram . nodes } ) ;
68+ updateNodeInternals ( laidOutDiagram . nodes . map ( ( node ) => node . id ) ) ;
69+ synchronizeLayoutData ( crypto . randomUUID ( ) , 'layout' , laidOutDiagram ) ;
8370 resolve ( ) ;
8471 } ) ;
8572 } ) ;
0 commit comments