Skip to content

Commit 633d03a

Browse files
authored
Merge pull request #1025 from TenTakano/remove_settimeout_from_demo_dagre
Remove setTimeout from demo-dagre to avoid layout breaks
2 parents 8031008 + 1be4073 commit 633d03a

File tree

2 files changed

+70
-55
lines changed

2 files changed

+70
-55
lines changed

.changeset/dull-bees-sing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@projectstorm/react-diagrams-gallery': minor
3+
---
4+
5+
Remove setTimeout from demo-dagre to avoid layout breaks

diagrams-demo-gallery/demos/demo-dagre/index.tsx

Lines changed: 65 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import createEngine, {
77
DiagramEngine,
88
PathFindingLinkFactory
99
} from '@projectstorm/react-diagrams';
10-
import * as React from 'react';
10+
import { useLayoutEffect, useRef } from 'react';
1111
import { DemoButton, DemoWorkspaceWidget } from '../helpers/DemoWorkspaceWidget';
1212
import { CanvasWidget } from '@projectstorm/react-canvas-core';
1313
import { DemoCanvasWidget } from '../helpers/DemoCanvasWidget';
@@ -33,72 +33,82 @@ function connectNodes(nodeFrom, nodeTo, engine: DiagramEngine) {
3333
/**
3434
* Tests auto distribution
3535
*/
36-
class DemoWidget extends React.Component<{ model: DiagramModel; engine: DiagramEngine }, any> {
37-
engine: DagreEngine;
38-
39-
constructor(props) {
40-
super(props);
41-
this.engine = new DagreEngine({
42-
graph: {
43-
rankdir: 'RL',
44-
ranker: 'longest-path',
45-
marginx: 25,
46-
marginy: 25
47-
},
48-
includeLinks: true,
49-
nodeMargin: 25
50-
});
51-
}
36+
function genDagreEngine() {
37+
return new DagreEngine({
38+
graph: {
39+
rankdir: 'RL',
40+
ranker: 'longest-path',
41+
marginx: 25,
42+
marginy: 25
43+
},
44+
includeLinks: true,
45+
nodeMargin: 25
46+
});
47+
}
5248

53-
autoDistribute = () => {
54-
this.engine.redistribute(this.props.model);
55-
56-
// only happens if pathfing is enabled (check line 25)
57-
this.reroute();
58-
this.props.engine.repaintCanvas();
59-
};
60-
61-
autoRefreshLinks = () => {
62-
this.engine.refreshLinks(this.props.model);
63-
64-
// only happens if pathfing is enabled (check line 25)
65-
this.reroute();
66-
this.props.engine.repaintCanvas();
67-
};
68-
componentDidMount(): void {
69-
setTimeout(() => {
70-
this.autoDistribute();
71-
}, 500);
72-
}
49+
function autoDistribute(engine: DiagramEngine) {
50+
const model = engine.getModel();
51+
52+
const dagreEngine = genDagreEngine();
53+
dagreEngine.redistribute(model);
54+
55+
reroute(engine);
56+
engine.repaintCanvas();
57+
}
58+
59+
function autoRefreshLinks(engine: DiagramEngine) {
60+
const model = engine.getModel();
7361

74-
reroute() {
75-
this.props.engine
62+
const dagreEngine = genDagreEngine();
63+
dagreEngine.refreshLinks(model);
64+
65+
// only happens if pathfing is enabled (check line 29)
66+
reroute(engine);
67+
engine.repaintCanvas();
68+
}
69+
70+
function reroute(engine: DiagramEngine) {
71+
engine
7672
.getLinkFactories()
7773
.getFactory<PathFindingLinkFactory>(PathFindingLinkFactory.NAME)
7874
.calculateRoutingMatrix();
75+
}
76+
77+
function DemoWidget(props) {
78+
const engine = props.engine;
79+
80+
useLayoutEffect(() => {
81+
autoDistribute(engine);
82+
}, []);
83+
84+
const redistribute = () => {
85+
autoDistribute(engine);
7986
}
8087

81-
render() {
82-
return (
83-
<DemoWorkspaceWidget
84-
buttons={
85-
<div>
86-
<DemoButton onClick={this.autoDistribute}>Re-distribute</DemoButton>
87-
<DemoButton onClick={this.autoRefreshLinks}>Refresh Links</DemoButton>
88-
</div>
89-
}
90-
>
91-
<DemoCanvasWidget>
92-
<CanvasWidget engine={this.props.engine} />
93-
</DemoCanvasWidget>
94-
</DemoWorkspaceWidget>
95-
);
88+
const refreshLinks = () => {
89+
autoRefreshLinks(engine);
9690
}
91+
92+
return (
93+
<DemoWorkspaceWidget
94+
buttons={
95+
<div>
96+
<DemoButton onClick={redistribute}>Re-distribute</DemoButton>
97+
<DemoButton onClick={refreshLinks}>Refresh Links</DemoButton>
98+
</div>
99+
}
100+
>
101+
<DemoCanvasWidget>
102+
<CanvasWidget engine={engine} />
103+
</DemoCanvasWidget>
104+
</DemoWorkspaceWidget>
105+
);
97106
}
98107

99108
export default () => {
100109
//1) setup the diagram engine
101-
let engine = createEngine();
110+
const engineRef = useRef(createEngine());
111+
let engine = engineRef.current;
102112

103113
//2) setup the diagram model
104114
let model = new DiagramModel();

0 commit comments

Comments
 (0)