From 7ab3572ea1b86c4f2d23f7dde85010bea5961b77 Mon Sep 17 00:00:00 2001 From: TenTakano Date: Wed, 27 Dec 2023 16:43:12 +0900 Subject: [PATCH 1/2] Remove setTimeout from demo-dagre to avoid layout breaks --- .../demos/demo-dagre/index.tsx | 120 ++++++++++-------- 1 file changed, 65 insertions(+), 55 deletions(-) diff --git a/diagrams-demo-gallery/demos/demo-dagre/index.tsx b/diagrams-demo-gallery/demos/demo-dagre/index.tsx index 021b2d65..89b96e8b 100644 --- a/diagrams-demo-gallery/demos/demo-dagre/index.tsx +++ b/diagrams-demo-gallery/demos/demo-dagre/index.tsx @@ -7,7 +7,7 @@ import createEngine, { DiagramEngine, PathFindingLinkFactory } from '@projectstorm/react-diagrams'; -import * as React from 'react'; +import { useLayoutEffect, useRef } from 'react'; import { DemoButton, DemoWorkspaceWidget } from '../helpers/DemoWorkspaceWidget'; import { CanvasWidget } from '@projectstorm/react-canvas-core'; import { DemoCanvasWidget } from '../helpers/DemoCanvasWidget'; @@ -33,72 +33,82 @@ function connectNodes(nodeFrom, nodeTo, engine: DiagramEngine) { /** * Tests auto distribution */ -class DemoWidget extends React.Component<{ model: DiagramModel; engine: DiagramEngine }, any> { - engine: DagreEngine; - - constructor(props) { - super(props); - this.engine = new DagreEngine({ - graph: { - rankdir: 'RL', - ranker: 'longest-path', - marginx: 25, - marginy: 25 - }, - includeLinks: true, - nodeMargin: 25 - }); - } +function genDagreEngine() { + return new DagreEngine({ + graph: { + rankdir: 'RL', + ranker: 'longest-path', + marginx: 25, + marginy: 25 + }, + includeLinks: true, + nodeMargin: 25 + }); +} - autoDistribute = () => { - this.engine.redistribute(this.props.model); - - // only happens if pathfing is enabled (check line 25) - this.reroute(); - this.props.engine.repaintCanvas(); - }; - - autoRefreshLinks = () => { - this.engine.refreshLinks(this.props.model); - - // only happens if pathfing is enabled (check line 25) - this.reroute(); - this.props.engine.repaintCanvas(); - }; - componentDidMount(): void { - setTimeout(() => { - this.autoDistribute(); - }, 500); - } +function autoDistribute(engine: DiagramEngine) { + const model = engine.getModel(); + + const dagreEngine = genDagreEngine(); + dagreEngine.redistribute(model); + + reroute(engine); + engine.repaintCanvas(); +} + +function autoRefreshLinks(engine: DiagramEngine) { + const model = engine.getModel(); - reroute() { - this.props.engine + const dagreEngine = genDagreEngine(); + dagreEngine.refreshLinks(model); + + // only happens if pathfing is enabled (check line 29) + reroute(engine); + engine.repaintCanvas(); +} + +function reroute(engine: DiagramEngine) { + engine .getLinkFactories() .getFactory(PathFindingLinkFactory.NAME) .calculateRoutingMatrix(); +} + +function DemoWidget(props) { + const engine = props.engine; + + useLayoutEffect(() => { + autoDistribute(engine); + }, []); + + const redistribute = () => { + autoDistribute(engine); } - render() { - return ( - - Re-distribute - Refresh Links - - } - > - - - - - ); + const refreshLinks = () => { + autoRefreshLinks(engine); } + + return ( + + Re-distribute + Refresh Links + + } + > + + + + + ); } export default () => { //1) setup the diagram engine - let engine = createEngine(); + const engineRef = useRef(createEngine()); + let engine = engineRef.current; //2) setup the diagram model let model = new DiagramModel(); From 1be40737f5ce6460061e41c2dbc7ccd4fe4f2a33 Mon Sep 17 00:00:00 2001 From: TenTakano Date: Thu, 28 Dec 2023 13:24:21 +0900 Subject: [PATCH 2/2] Add changeset --- .changeset/dull-bees-sing.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/dull-bees-sing.md diff --git a/.changeset/dull-bees-sing.md b/.changeset/dull-bees-sing.md new file mode 100644 index 00000000..8790d224 --- /dev/null +++ b/.changeset/dull-bees-sing.md @@ -0,0 +1,5 @@ +--- +'@projectstorm/react-diagrams-gallery': minor +--- + +Remove setTimeout from demo-dagre to avoid layout breaks