Skip to content

Commit 4d04184

Browse files
authored
feature/MIG-6604 Selected node and edge (#25)
1 parent 417b7de commit 4d04184

File tree

7 files changed

+106
-22
lines changed

7 files changed

+106
-22
lines changed

src/components/edge/edge.test.tsx

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { render, screen } from '@/mocks/testing-utils';
2+
import { Edge } from '@/components/edge/edge';
3+
4+
describe('edge', () => {
5+
it('Should have selected edge', () => {
6+
render(
7+
<Edge
8+
data-testid={'edge'}
9+
path={'M0,0 L100,100'}
10+
markerStart={"url('#start-one')"}
11+
markerEnd={"url('#end-one')"}
12+
selected={true}
13+
/>,
14+
);
15+
const edge = screen.getByTestId('edge');
16+
expect(edge).toHaveAttribute('marker-start', "url('#start-one-selected')");
17+
expect(edge).toHaveAttribute('marker-end', "url('#end-one-selected')");
18+
});
19+
it('Should not have selected edge', () => {
20+
render(
21+
<Edge
22+
data-testid={'edge'}
23+
path={'M0,0 L100,100'}
24+
markerStart={"url('#start-one')"}
25+
markerEnd={"url('#end-one')"}
26+
/>,
27+
);
28+
const edge = screen.getByTestId('edge');
29+
expect(edge).toHaveAttribute('marker-start', "url('#start-one')");
30+
expect(edge).toHaveAttribute('marker-end', "url('#end-one')");
31+
});
32+
});

src/components/edge/edge.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { BaseEdge } from '@xyflow/react';
2+
import { palette } from '@leafygreen-ui/palette';
3+
import { SVGAttributes } from 'react';
4+
5+
interface Props extends SVGAttributes<SVGPathElement> {
6+
selected?: boolean;
7+
path: string;
8+
}
9+
10+
const getMarker = (selected?: boolean, marker?: string) => {
11+
return selected ? marker?.replace(/'\)/, "-selected')") : marker;
12+
};
13+
14+
export const Edge = ({ markerStart, markerEnd, selected, ...rest }: Props) => {
15+
return (
16+
<BaseEdge
17+
markerEnd={getMarker(selected, markerEnd)}
18+
markerStart={getMarker(selected, markerStart)}
19+
style={{ stroke: selected ? palette.blue.base : palette.gray.base }}
20+
{...rest}
21+
/>
22+
);
23+
};

src/components/edge/floating-edge.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
1-
import { EdgeProps, getSmoothStepPath, useNodes, BaseEdge } from '@xyflow/react';
1+
import { EdgeProps, getSmoothStepPath, useNodes } from '@xyflow/react';
22
import { useMemo } from 'react';
3-
import styled from '@emotion/styled';
4-
import { palette } from '@leafygreen-ui/palette';
53

64
import { getEdgeParams } from '@/utilities/get-edge-params';
75
import { InternalNode } from '@/types/internal';
6+
import { Edge } from '@/components/edge/edge';
87

9-
const Edge = styled(BaseEdge)`
10-
stroke: ${palette.gray.base};
11-
`;
12-
13-
export const FloatingEdge = ({ id, source, target, markerEnd, markerStart }: EdgeProps) => {
8+
export const FloatingEdge = ({ id, source, target, markerEnd, markerStart, selected }: EdgeProps) => {
149
const nodes = useNodes<InternalNode>();
1510

1611
const { sourceNode, targetNode } = useMemo(() => {
@@ -33,6 +28,13 @@ export const FloatingEdge = ({ id, source, target, markerEnd, markerStart }: Edg
3328
});
3429

3530
return (
36-
<Edge data-testid={`floating-edge-${id}`} markerEnd={markerEnd} markerStart={markerStart} path={path} id={id} />
31+
<Edge
32+
data-testid={`floating-edge-${id}`}
33+
markerEnd={markerEnd}
34+
markerStart={markerStart}
35+
path={path}
36+
id={id}
37+
selected={selected}
38+
/>
3739
);
3840
};

src/components/edge/self-referencing-edge.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,12 @@
1-
import { BaseEdge, EdgeProps, useNodes } from '@xyflow/react';
1+
import { EdgeProps, useNodes } from '@xyflow/react';
22
import { useMemo } from 'react';
33
import { path } from 'd3-path';
4-
import styled from '@emotion/styled';
5-
import { palette } from '@leafygreen-ui/palette';
64

75
import { InternalNode } from '@/types/internal';
86
import { DEFAULT_MARKER_SIZE } from '@/utilities/constants';
7+
import { Edge } from '@/components/edge/edge';
98

10-
const Edge = styled(BaseEdge)`
11-
stroke: ${palette.gray.base};
12-
`;
13-
14-
export const SelfReferencingEdge = ({ id, source, markerEnd, markerStart }: EdgeProps) => {
9+
export const SelfReferencingEdge = ({ id, source, markerEnd, markerStart, selected }: EdgeProps) => {
1510
const nodes = useNodes<InternalNode>();
1611

1712
const { sourceNode } = useMemo(() => {
@@ -58,6 +53,7 @@ export const SelfReferencingEdge = ({ id, source, markerEnd, markerStart }: Edge
5853
markerEnd={markerEnd}
5954
markerStart={markerStart}
6055
path={context.toString()}
56+
selected={selected}
6157
id={id}
6258
/>
6359
);

src/components/markers/marker-list.tsx

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ReactNode } from 'react';
2+
import { palette } from '@leafygreen-ui/palette';
23

34
import { Marker } from '@/components/markers/marker';
45
import MarkerOneOrMany from '@/assets/markers/marker-one-or-many.svg?react';
@@ -14,34 +15,64 @@ const markerList: Record<string, MarkerProps> = {
1415
component: <MarkerOneOrMany />,
1516
orient: 'auto-start-reverse',
1617
},
18+
'start-oneOrMany-selected': {
19+
component: <MarkerOneOrMany />,
20+
orient: 'auto-start-reverse',
21+
fill: palette.blue.base,
22+
},
1723
'end-oneOrMany': {
1824
component: <MarkerOneOrMany />,
1925
orient: 'auto',
2026
},
27+
'end-oneOrMany-selected': {
28+
component: <MarkerOneOrMany />,
29+
orient: 'auto',
30+
fill: palette.blue.base,
31+
},
2132
'start-one': {
2233
component: <MarkerOne />,
2334
orient: 'auto-start-reverse',
2435
},
36+
'start-one-selected': {
37+
component: <MarkerOne />,
38+
orient: 'auto-start-reverse',
39+
fill: palette.blue.base,
40+
},
2541
'end-one': {
2642
component: <MarkerOne />,
2743
orient: 'auto',
2844
},
45+
'end-one-selected': {
46+
component: <MarkerOne />,
47+
orient: 'auto',
48+
fill: palette.blue.base,
49+
},
2950
'start-many': {
3051
component: <MarkerMany />,
3152
orient: 'auto-start-reverse',
3253
},
54+
'start-many-selected': {
55+
component: <MarkerMany />,
56+
orient: 'auto-start-reverse',
57+
fill: palette.blue.base,
58+
},
3359
'end-many': {
3460
component: <MarkerMany />,
3561
orient: 'auto',
3662
},
63+
'end-many-selected': {
64+
component: <MarkerMany />,
65+
orient: 'auto',
66+
fill: palette.blue.base,
67+
},
3768
};
3869

3970
export const MarkerList = () => {
4071
return (
4172
<svg>
4273
<defs>
43-
{Object.entries(markerList).map(([id, { component, orient }]) => (
44-
<Marker key={id} data-testid={id} orient={orient} id={id}>
74+
{Object.entries(markerList).map(([id, { component, ...rest }]) => (
75+
<Marker key={id} data-testid={id} id={id} {...rest}>
4576
{component}
4677
</Marker>
4778
))}

src/components/markers/marker.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ export const Marker = ({ children, id, ...rest }: Props) => {
99
return (
1010
<marker
1111
id={id}
12-
style={{ fill: palette.gray.base }}
1312
markerHeight={DEFAULT_MARKER_SIZE}
1413
markerWidth={DEFAULT_MARKER_SIZE}
1514
refX={DEFAULT_MARKER_SIZE / 2}
1615
refY={DEFAULT_MARKER_SIZE / 2}
16+
fill={palette.gray.base}
1717
{...rest}
1818
>
1919
{children}

src/components/node/node.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ const NodeHandle = styled(Handle)`
8080
visibility: hidden;
8181
`;
8282

83-
export const Node = ({ type, data: { title, fields, borderVariant } }: NodeProps<InternalNode>) => {
83+
export const Node = ({ type, selected, data: { title, fields, borderVariant } }: NodeProps<InternalNode>) => {
8484
const theme = useTheme();
8585
const { zoom } = useViewport();
8686

@@ -94,7 +94,7 @@ export const Node = ({ type, data: { title, fields, borderVariant } }: NodeProps
9494
const isContextualZoom = zoom < ZOOM_THRESHOLD;
9595

9696
return (
97-
<NodeBorder variant={borderVariant}>
97+
<NodeBorder variant={selected ? 'selected' : borderVariant}>
9898
<NodeHandle id="source" position={Position.Right} type="source" />
9999
<NodeHandle id="source" position={Position.Left} type="target" />
100100
<NodeWrapper accent={getAccent()}>

0 commit comments

Comments
 (0)