Skip to content

Commit 8fb2ec4

Browse files
committed
feat: MoveCollection COMPASS-9434
1 parent 6e69f68 commit 8fb2ec4

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { DataModelingState } from '../store/reducer';
1010
import {
1111
applyEdit,
1212
applyInitialLayout,
13+
moveCollection,
1314
getCurrentDiagramFromState,
1415
selectCurrentModel,
1516
} from '../store/diagram';
@@ -123,6 +124,7 @@ const DiagramEditor: React.FunctionComponent<{
123124
onCancelClick: () => void;
124125
onApplyClick: (edit: Omit<Edit, 'id' | 'timestamp'>) => void;
125126
onApplyInitialLayout: (positions: Record<string, [number, number]>) => void;
127+
onMoveCollection: (ns: string, newPosition: [number, number]) => void;
126128
}> = ({
127129
diagramLabel,
128130
step,
@@ -132,6 +134,7 @@ const DiagramEditor: React.FunctionComponent<{
132134
onCancelClick,
133135
onApplyClick,
134136
onApplyInitialLayout,
137+
onMoveCollection,
135138
}) => {
136139
const { log, mongoLogId } = useLogger('COMPASS-DATA-MODELING-DIAGRAM-EDITOR');
137140
const isDarkMode = useDarkMode();
@@ -333,6 +336,9 @@ const DiagramEditor: React.FunctionComponent<{
333336
maxZoom: 1,
334337
minZoom: 0.25,
335338
}}
339+
onNodeDragStop={(evt, node) => {
340+
onMoveCollection(node.id, [node.position.x, node.position.y]);
341+
}}
336342
onEdgeClick={(evt, edge) => {
337343
setApplyInput(
338344
JSON.stringify(
@@ -412,5 +418,6 @@ export default connect(
412418
onCancelClick: cancelAnalysis,
413419
onApplyClick: applyEdit,
414420
onApplyInitialLayout: applyInitialLayout,
421+
onMoveCollection: moveCollection,
415422
}
416423
)(DiagramEditor);

packages/compass-data-modeling/src/services/data-model-storage.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ const EditSchemaVariants = z.discriminatedUnion('type', [
5555
type: z.literal('RemoveRelationship'),
5656
relationshipId: z.string().uuid(),
5757
}),
58+
z.object({
59+
type: z.literal('MoveCollection'),
60+
ns: z.string(),
61+
newPosition: z.tuple([z.number(), z.number()]),
62+
}),
5863
]);
5964

6065
export const EditSchema = z.intersection(EditSchemaBase, EditSchemaVariants);

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,23 @@ export function redoEdit(): DataModelingThunkAction<void, RedoEditAction> {
260260
};
261261
}
262262

263+
export function moveCollection(
264+
ns: string,
265+
newPosition: [number, number]
266+
): DataModelingThunkAction<void, ApplyEditAction | ApplyEditFailedAction> {
267+
return (dispatch) => {
268+
const edit: Omit<
269+
Extract<Edit, { type: 'MoveCollection' }>,
270+
'id' | 'timestamp'
271+
> = {
272+
type: 'MoveCollection',
273+
ns,
274+
newPosition,
275+
};
276+
dispatch(applyEdit(edit));
277+
};
278+
}
279+
263280
export function applyEdit(
264281
rawEdit: Omit<Edit, 'id' | 'timestamp'>
265282
): DataModelingThunkAction<void, ApplyEditAction | ApplyEditFailedAction> {
@@ -367,6 +384,20 @@ function _applyEdit(edit: Edit, model?: StaticModel): StaticModel {
367384
),
368385
};
369386
}
387+
case 'MoveCollection': {
388+
return {
389+
...model,
390+
collections: model.collections.map((collection) => {
391+
if (collection.ns === edit.ns) {
392+
return {
393+
...collection,
394+
displayPosition: edit.newPosition,
395+
};
396+
}
397+
return collection;
398+
}),
399+
};
400+
}
370401
default: {
371402
return model;
372403
}

0 commit comments

Comments
 (0)