Skip to content

Commit 91e4166

Browse files
committed
reference external nodes instead of converting and hasChildren
1 parent 7b78aec commit 91e4166

File tree

12 files changed

+162
-339
lines changed

12 files changed

+162
-339
lines changed

src/components/canvas/canvas.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { SelfReferencingEdge } from '@/components/edge/self-referencing-edge';
2020
import { FieldEdge } from '@/components/edge/field-edge';
2121
import { MarkerList } from '@/components/markers/marker-list';
2222
import { ConnectionLine } from '@/components/line/connection-line';
23-
import { convertToExternalNode, convertToExternalNodes, convertToInternalNodes } from '@/utilities/convert-nodes';
23+
import { getExternalNode, convertToInternalNodes } from '@/utilities/convert-nodes';
2424
import { convertToExternalEdge, convertToExternalEdges, convertToInternalEdges } from '@/utilities/convert-edges';
2525
import { EditableDiagramInteractionsProvider } from '@/hooks/use-editable-diagram-interactions';
2626

@@ -95,28 +95,28 @@ export const Canvas = ({
9595

9696
const _onNodeContextMenu = useCallback(
9797
(event: MouseEvent, node: InternalNode) => {
98-
onNodeContextMenu?.(event, convertToExternalNode(node));
98+
onNodeContextMenu?.(event, getExternalNode(node));
9999
},
100100
[onNodeContextMenu],
101101
);
102102

103103
const _onNodeDrag = useCallback(
104104
(event: MouseEvent, node: InternalNode, nodes: InternalNode[]) => {
105-
onNodeDrag?.(event, convertToExternalNode(node), convertToExternalNodes(nodes));
105+
onNodeDrag?.(event, getExternalNode(node), nodes.map(getExternalNode));
106106
},
107107
[onNodeDrag],
108108
);
109109

110110
const _onNodeDragStop = useCallback(
111111
(event: MouseEvent, node: InternalNode, nodes: InternalNode[]) => {
112-
onNodeDragStop?.(event, convertToExternalNode(node), convertToExternalNodes(nodes));
112+
onNodeDragStop?.(event, getExternalNode(node), nodes.map(getExternalNode));
113113
},
114114
[onNodeDragStop],
115115
);
116116

117117
const _onSelectionDragStop = useCallback(
118118
(event: MouseEvent, nodes: InternalNode[]) => {
119-
onSelectionDragStop?.(event, convertToExternalNodes(nodes));
119+
onSelectionDragStop?.(event, nodes.map(getExternalNode));
120120
},
121121
[onSelectionDragStop],
122122
);
@@ -130,21 +130,21 @@ export const Canvas = ({
130130

131131
const _onNodeClick = useCallback(
132132
(event: MouseEvent, node: InternalNode) => {
133-
onNodeClick?.(event, convertToExternalNode(node));
133+
onNodeClick?.(event, getExternalNode(node));
134134
},
135135
[onNodeClick],
136136
);
137137

138138
const _onSelectionContextMenu = useCallback(
139139
(event: MouseEvent, nodes: InternalNode[]) => {
140-
onSelectionContextMenu?.(event, convertToExternalNodes(nodes));
140+
onSelectionContextMenu?.(event, nodes.map(getExternalNode));
141141
},
142142
[onSelectionContextMenu],
143143
);
144144

145145
const _onSelectionChange = useCallback(
146146
({ nodes, edges }: { nodes: InternalNode[]; edges: InternalEdge[] }) => {
147-
onSelectionChange?.({ nodes: convertToExternalNodes(nodes), edges: convertToExternalEdges(edges) });
147+
onSelectionChange?.({ nodes: nodes.map(getExternalNode), edges: convertToExternalEdges(edges) });
148148
},
149149
[onSelectionChange],
150150
);

src/components/field/field-list.test.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ describe('field-list', () => {
3535
<FieldWithEditableInteractions
3636
onFieldClick={onFieldClick}
3737
fields={[
38-
{ name: 'field-with-just-name', selectable: true, expandable: false },
39-
{ id: ['field', 'with', 'id'], name: 'and-custom-name', selectable: true, expandable: false },
38+
{ name: 'field-with-just-name', selectable: true, hasChildren: false },
39+
{ id: ['field', 'with', 'id'], name: 'and-custom-name', selectable: true, hasChildren: false },
4040
]}
4141
/>,
4242
);
@@ -58,16 +58,16 @@ describe('field-list', () => {
5858
});
5959
});
6060

61-
it('should ensure that items that are expandable have the toggle', () => {
61+
it('should ensure that items that are hasChildren have the toggle', () => {
6262
const onFieldExpandToggle = vi.fn();
6363
render(
6464
<FieldWithEditableInteractions
6565
onFieldExpandToggle={onFieldExpandToggle}
6666
fields={[
67-
{ id: ['other'], name: 'other', expandable: false },
68-
{ id: ['parent'], name: 'parent', expanded: true, expandable: true },
69-
{ id: ['parent', 'child1'], name: 'child1', depth: 1, expandable: false },
70-
{ id: ['parent', 'child2'], name: 'child2', depth: 1, expandable: false },
67+
{ id: ['other'], name: 'other', hasChildren: false },
68+
{ id: ['parent'], name: 'parent', expanded: true, hasChildren: true },
69+
{ id: ['parent', 'child1'], name: 'child1', depth: 1, hasChildren: false },
70+
{ id: ['parent', 'child2'], name: 'child2', depth: 1, hasChildren: false },
7171
]}
7272
/>,
7373
);

src/components/field/field-list.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ import { useMemo } from 'react';
22
import styled from '@emotion/styled';
33

44
import { Field } from '@/components/field/field';
5-
import { NodeField, NodeType } from '@/types';
5+
import { NodeType } from '@/types/node';
66
import { DEFAULT_PREVIEW_GROUP_AREA, getPreviewGroupArea, getPreviewId } from '@/utilities/get-preview-group-area';
77
import { DEFAULT_FIELD_PADDING } from '@/utilities/constants';
88
import { getSelectedFieldGroupHeight, getSelectedId } from '@/utilities/get-selected-field-group-height';
99
import { useEditableDiagramInteractions } from '@/hooks/use-editable-diagram-interactions';
10+
import { InternalNodeField } from '@/types/internal';
1011

1112
const NodeFieldWrapper = styled.div`
1213
padding: ${DEFAULT_FIELD_PADDING}px;
@@ -17,7 +18,7 @@ interface Props {
1718
nodeType: NodeType;
1819
isHovering?: boolean;
1920
nodeId: string;
20-
fields: (NodeField & { expandable: boolean })[];
21+
fields: InternalNodeField[];
2122
}
2223

2324
export const FieldList = ({ fields, nodeId, nodeType, isHovering }: Props) => {

src/components/field/field.test.tsx

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -345,47 +345,47 @@ describe('field', () => {
345345
});
346346

347347
describe('Expand/Collapse', () => {
348-
describe('When the field is expandable', () => {
349-
const expandableProps = {
348+
describe('When the field has children', () => {
349+
const hasChildrenProps = {
350350
...DEFAULT_PROPS,
351351
onFieldExpandToggle: vi.fn(),
352-
expandable: true,
352+
hasChildren: true,
353353
};
354354
beforeEach(() => {
355-
expandableProps.onFieldExpandToggle.mockClear();
355+
hasChildrenProps.onFieldExpandToggle.mockClear();
356356
});
357357
it('Shows collapse icon by default', async () => {
358-
render(<FieldWithEditableInteractions {...expandableProps} expandable={true} />);
358+
render(<FieldWithEditableInteractions {...hasChildrenProps} hasChildren={true} />);
359359
const toggle = screen.getByRole('button', { name: 'Collapse Field' });
360360
expect(toggle).toBeInTheDocument();
361361
await userEvent.click(toggle);
362-
expect(expandableProps.onFieldExpandToggle).toHaveBeenCalled();
362+
expect(hasChildrenProps.onFieldExpandToggle).toHaveBeenCalled();
363363
});
364364

365365
it('Shows expand icon for a collapsed field', async () => {
366-
render(<FieldWithEditableInteractions {...expandableProps} expanded={false} />);
366+
render(<FieldWithEditableInteractions {...hasChildrenProps} expanded={false} />);
367367
const toggle = screen.getByRole('button', { name: 'Expand Field' });
368368
expect(toggle).toBeInTheDocument();
369369
await userEvent.click(toggle);
370-
expect(expandableProps.onFieldExpandToggle).toHaveBeenCalled();
370+
expect(hasChildrenProps.onFieldExpandToggle).toHaveBeenCalled();
371371
});
372372

373373
it('Shows collapse icon for an expanded field', async () => {
374-
render(<FieldWithEditableInteractions {...expandableProps} expanded={true} />);
374+
render(<FieldWithEditableInteractions {...hasChildrenProps} expanded={true} />);
375375
const toggle = screen.getByRole('button', { name: 'Collapse Field' });
376376
expect(toggle).toBeInTheDocument();
377377
await userEvent.click(toggle);
378-
expect(expandableProps.onFieldExpandToggle).toHaveBeenCalled();
378+
expect(hasChildrenProps.onFieldExpandToggle).toHaveBeenCalled();
379379
});
380380
});
381381

382-
describe('When the field is not expandable', () => {
382+
describe('When the field is not hasChildren', () => {
383383
it('Does not show the collapse/expand toggle', () => {
384384
render(
385385
<FieldWithEditableInteractions
386386
{...DEFAULT_PROPS}
387387
onFieldExpandToggle={vi.fn()}
388-
expandable={false}
388+
hasChildren={false}
389389
expanded={true}
390390
/>,
391391
);
@@ -400,7 +400,7 @@ describe('field', () => {
400400
<FieldWithEditableInteractions
401401
{...DEFAULT_PROPS}
402402
onFieldExpandToggle={undefined}
403-
expandable={true}
403+
hasChildren={true}
404404
expanded={true}
405405
/>,
406406
);

src/components/field/field.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ interface Props extends NodeField {
111111
isHovering?: boolean;
112112
previewGroupArea: PreviewGroupArea;
113113
selectedGroupHeight?: number;
114-
expandable?: boolean;
114+
hasChildren?: boolean;
115115
}
116116

117117
export const Field = ({
@@ -130,7 +130,7 @@ export const Field = ({
130130
spacing = 0,
131131
selectable = false,
132132
selected = false,
133-
expandable = false,
133+
hasChildren = false,
134134
expanded = true,
135135
editable = false,
136136
variant,
@@ -192,7 +192,7 @@ export const Field = ({
192192
isDisabled={isDisabled}
193193
depth={depth}
194194
isEditable={selected && editable && !isDisabled}
195-
isExpandable={expandable}
195+
isExpandable={hasChildren}
196196
name={name}
197197
type={type}
198198
id={id}

0 commit comments

Comments
 (0)