Skip to content

Commit 27c4dca

Browse files
committed
feat(COMPASS-9432): apply initial layout
1 parent 7756845 commit 27c4dca

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

packages/compass-data-modeling/src/components/diagram-editor.tsx

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import React, { useCallback, useMemo, useRef, useState } from 'react';
1+
import React, {
2+
useCallback,
3+
useMemo,
4+
useRef,
5+
useEffect,
6+
useState,
7+
} from 'react';
28
import { connect } from 'react-redux';
39
import type { DataModelingState } from '../store/reducer';
410
import {
@@ -28,9 +34,11 @@ import {
2834
type NodeProps,
2935
type EdgeProps,
3036
useDiagram,
37+
applyLayout,
3138
} from '@mongodb-js/diagramming';
3239
import type { Edit, StaticModel } from '../services/data-model-storage';
3340
import { UUID } from 'bson';
41+
import { initial } from 'lodash';
3442

3543
const loadingContainerStyles = css({
3644
width: '100%',
@@ -135,6 +143,7 @@ const DiagramEditor: React.FunctionComponent<{
135143
const isDarkMode = useDarkMode();
136144
const diagramContainerRef = useRef<HTMLDivElement | null>(null);
137145
const diagram = useDiagram();
146+
const [nodes, setNodes] = useState<NodeProps[]>([]);
138147

139148
const setDiagramContainerRef = useCallback(
140149
(ref: HTMLDivElement | null) => {
@@ -208,8 +217,26 @@ const DiagramEditor: React.FunctionComponent<{
208217
});
209218
}, [model?.relationships]);
210219

211-
const nodes = useMemo(() => {
212-
return (model?.collections ?? []).map(
220+
const applyInitialLayout = useCallback(
221+
async (storedNodes: NodeProps[]) => {
222+
console.log('INITIAL STATE: applying layout');
223+
try {
224+
const { nodes: positionedNodes } = await applyLayout(
225+
storedNodes,
226+
edges,
227+
'STAR'
228+
);
229+
// TODO: save the new positions to the model
230+
setNodes(positionedNodes);
231+
} catch (err) {
232+
console.error('Error applying layout:', err);
233+
}
234+
},
235+
[setNodes]
236+
);
237+
238+
useEffect(() => {
239+
const storedNodes = (model?.collections ?? []).map(
213240
(coll): NodeProps => ({
214241
id: coll.ns,
215242
type: 'collection',
@@ -234,12 +261,16 @@ const DiagramEditor: React.FunctionComponent<{
234261
};
235262
}
236263
),
237-
measured: {
238-
width: 100,
239-
height: 200,
240-
},
241264
})
242265
);
266+
const isInitialState = storedNodes.every(
267+
(node) => node.position.x === -1 && node.position.y === -1
268+
);
269+
if (isInitialState) {
270+
void applyInitialLayout(storedNodes);
271+
return;
272+
}
273+
setNodes(storedNodes);
243274
}, [model?.collections]);
244275

245276
let content;

packages/compass-data-modeling/src/store/diagram.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ export const diagramReducer: Reducer<DiagramState> = (
118118
// TODO
119119
indexes: [],
120120
shardKey: undefined,
121-
// TODO: handle correct display position
122-
displayPosition: [Math.random() * 1000, Math.random() * 1000],
121+
displayPosition: [-1, -1],
123122
})),
124123
relationships: action.relations,
125124
},

0 commit comments

Comments
 (0)