@@ -7,35 +7,26 @@ import {
77 GraphCanvas ,
88 MultipointConnection ,
99 TConnection ,
10- useElk ,
1110 useGraph ,
1211 useGraphEvent ,
1312} from '@gravity-ui/graph/react' ;
1413import type { Data , GraphNode , Options , Shapes } from '@gravity-ui/paranoid' ;
15- import type { ElkExtendedEdge , ElkNode } from 'elkjs' ;
16- import ELK from 'elkjs' ;
1714
18- import {
19- prepareBlocks ,
20- prepareChildren ,
21- prepareConnections ,
22- prepareEdges ,
23- parseCustomPropertyValue ,
24- } from './utils' ;
15+ import { prepareBlocks , prepareConnections , parseCustomPropertyValue } from './utils' ;
2516
2617import { cn } from '../../utils/cn' ;
2718
2819import './GravityGraph.scss' ;
2920
3021const b = cn ( 'ydb-gravity-graph' ) ;
3122
32- // import {QueryBlockView} from './BlockComponents/QueryBlockView';
3323import { QueryBlockComponent } from './BlockComponents/QueryBlockComponent' ;
3424import { ResultBlockComponent } from './BlockComponents/ResultBlockComponent' ;
3525import { StageBlockComponent } from './BlockComponents/StageBlockComponent' ;
3626import { ConnectionBlockComponent } from './BlockComponents/ConnectionBlockComponent' ;
3727import { graphColorsConfig } from './colorsConfig' ;
38- import { GraphControls } from './GraphControls' ;
28+ import { GraphControls } from './GraphControls' ;
29+ import { calculateTreeLayout , calculateConnectionPaths } from './treeLayout' ;
3930
4031interface Props < T > {
4132 data : Data < T > ;
@@ -55,26 +46,7 @@ const config: TGraphConfig = {
5546 } ,
5647} ;
5748
58- const baseElkConfig = {
59- id : 'root' ,
60- layoutOptions : {
61- 'elk.algorithm' : 'layered' ,
62- 'elk.direction' : 'DOWN' ,
63- // 'elk.spacing.edgeNode': '50',
64- 'elk.layered.spacing.nodeNodeBetweenLayers' : '20' ,
65- 'elk.layered.nodePlacement.bk.fixedAlignment' : 'BALANCED' ,
66- 'elk.layered.nodePlacement.bk.ordering' : 'INTERACTIVE' ,
67- // 'elk.debugMode': true,
68- // 'elk.alignment': 'CENTER'
69- } ,
70- } ;
71-
72-
73- const elk = new ELK ( ) ;
74-
7549const renderBlockFn = ( graph , block ) => {
76- // console.log('===', block);
77-
7850 const map = {
7951 query : QueryBlockComponent ,
8052 result : ResultBlockComponent ,
@@ -88,10 +60,14 @@ const renderBlockFn = (graph, block) => {
8860 < GraphBlock graph = { graph } block = { block } className = { b ( 'block' ) } >
8961 { Component ? (
9062 < >
91- < Component graph = { graph } block = { block } className = { b ( 'block-content' , block . is ) } />
92- { block . id !== 'undefined' && block . is !== 'result' && < div className = { b ( 'block-id' ) } >
93- #{ block . id }
94- </ div > }
63+ < Component
64+ graph = { graph }
65+ block = { block }
66+ className = { b ( 'block-content' , block . is ) }
67+ />
68+ { block . id !== 'undefined' && block . is !== 'result' && (
69+ < div className = { b ( 'block-id' ) } > #{ block . id } </ div >
70+ ) }
9571 </ >
9672 ) : (
9773 block . id
@@ -101,39 +77,19 @@ const renderBlockFn = (graph, block) => {
10177} ;
10278
10379export function GravityGraph < T > ( { data, theme} : Props < T > ) {
104- const _blocks = useMemo ( ( ) => prepareBlocks ( data . nodes ) , [ data . nodes ] ) ;
105- const _connections = useMemo ( ( ) => prepareConnections ( data . links ) , [ data . links ] ) ;
106- const elkConfig = useMemo (
107- ( ) => ( {
108- ...baseElkConfig ,
109- children : prepareChildren ( _blocks ) ,
110- edges : prepareEdges ( _connections ) ,
111- } ) ,
112- [ _blocks , _connections ] ,
113- ) ;
11480 const { graph, start} = useGraph ( config ) ;
115- const { isLoading, result} = useElk ( elkConfig , elk ) ;
11681
11782 React . useEffect ( ( ) => {
118- if ( isLoading || ! result ) {
119- return ;
120- }
121-
122- const blocks = _blocks . map ( ( block ) => ( {
123- ...block ,
124- ...result . blocks [ block . id ] ,
125- } ) ) ;
126-
127- const connections = _connections . map ( ( connection ) => ( {
128- ...connection ,
129- ...( connection . id ? result . edges [ connection . id ] : { } ) ,
130- } ) ) ;
83+ const blocks = prepareBlocks ( data . nodes ) ;
84+ const connections = prepareConnections ( data . links ) ;
85+ const layouted = calculateTreeLayout ( blocks , connections ) ;
86+ const edges = calculateConnectionPaths ( layouted , connections ) ;
13187
13288 graph . setEntities ( {
133- blocks,
134- connections,
89+ blocks : layouted ,
90+ connections : edges ,
13591 } ) ;
136- } , [ isLoading , result , graph ] ) ;
92+ } , [ data . nodes , data . links , graph ] ) ;
13793
13894 React . useEffect ( ( ) => {
13995 graph . setColors ( parseCustomPropertyValue ( graphColorsConfig , graph . getGraphCanvas ( ) ) ) ;
@@ -148,20 +104,18 @@ export function GravityGraph<T>({data, theme}: Props<T>) {
148104 } ) ;
149105 graph . setConstants ( {
150106 block : {
151- SCALES : [ 0.125 , 0.225 , 0.5 ] // Detailed view stays until zoom = 0.5
152- }
107+ SCALES : [ 0.125 , 0.225 , 0.5 ] , // Detailed view stays until zoom = 0.5
108+ } ,
153109 } ) ;
154110 start ( ) ;
155111 // graph.zoomTo("center", { padding: 300 });
156112 }
157113 } ) ;
158114
159- // useGraphEvent(graph, 'connection-selection-change', (event) => {
160- // console.log('connection-click', event);
161- // });
162-
163- return < >
164- < GraphCanvas graph = { graph } renderBlock = { renderBlockFn } />
165- < GraphControls graph = { graph } />
166- </ > ;
115+ return (
116+ < >
117+ < GraphCanvas graph = { graph } renderBlock = { renderBlockFn } />
118+ < GraphControls graph = { graph } />
119+ </ >
120+ ) ;
167121}
0 commit comments