-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDiagram.tsx
More file actions
125 lines (113 loc) · 2.85 KB
/
Copy pathDiagram.tsx
File metadata and controls
125 lines (113 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import {
ReactFlow,
type Node,
type Edge,
type OnConnect,
addEdge,
useNodesState,
useEdgesState,
Background,
BackgroundVariant,
MiniMap,
Controls,
MarkerType,
ConnectionMode,
Panel,
useReactFlow,
} from '@xyflow/react';
import '@xyflow/react/dist/style.css';
import { useCallback } from 'react';
import { CustomNodeTemplate } from './node-templates/custom-node-template';
import { CustomEdgeTemplate } from './edge-templates/custom-edge-template';
import { useAutoLayout } from './hooks/use-autolayout';
import { LabelButton } from '@synergycodes/axiom';
const initialNodes: Node[] = [
{
id: '1',
position: { x: 0, y: 0 },
data: { title: 'Title 1', subtitle: 'Subtitle 1' },
type: 'custom',
},
{
id: '2',
position: { x: 200, y: 100 },
data: { title: 'Title 2', subtitle: 'Subtitle 2' },
type: 'custom',
},
];
const initialEdges: Edge[] = [
{
id: 'e1-2',
source: '1',
target: '2',
sourceHandle: 'source2',
markerEnd: { type: MarkerType.Arrow },
type: 'custom',
label: 'Edge label',
},
];
const nodeTypes = { custom: CustomNodeTemplate };
const edgeTypes = { custom: CustomEdgeTemplate };
export default function Diagram() {
const [nodes, , onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
const { addNodes } = useReactFlow();
const onConnect: OnConnect = useCallback(
(connection) => {
setEdges((eds) =>
addEdge(
{
...connection,
type: 'custom',
markerEnd: { type: MarkerType.Arrow },
},
eds,
),
);
},
[setEdges],
);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(window as any).nodes = nodes;
const onAddNodeButtonClicked = () => {
addNodes({
id: crypto.randomUUID(),
position: { x: 0, y: 0 },
data: { title: 'Title', subtitle: 'Subtitle' },
type: 'custom',
});
};
const { layoutNodes } = useAutoLayout();
const onLayoutNodesButtonClicked = () => {
layoutNodes();
};
return (
<ReactFlow
nodes={nodes}
edges={edges}
onNodesChange={onNodesChange}
onEdgesChange={onEdgesChange}
onConnect={onConnect}
fitView
snapToGrid
snapGrid={[20, 20]}
onlyRenderVisibleElements
nodeTypes={nodeTypes}
edgeTypes={edgeTypes}
connectionMode={ConnectionMode.Loose}
>
<Background variant={BackgroundVariant.Lines} />
<MiniMap pannable zoomable zoomStep={1} />
<Controls />
<Panel position="top-left">
<LabelButton onClick={onAddNodeButtonClicked} label="Add node" />
</Panel>
<Panel position="top-right">
<LabelButton
onClick={onLayoutNodesButtonClicked}
label="Layout nodes"
/>
</Panel>
</ReactFlow>
);
}