Skip to content

Commit 7dd9e24

Browse files
committed
fix edge markers and add colors of intent states for v12 support
1 parent f043a50 commit 7dd9e24

7 files changed

Lines changed: 119 additions & 28 deletions

File tree

src/extensions/react-flow/_react-flow.scss

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
@import "config";
22
@import "nodes/nodes";
33
@import "edges/edges";
4+
@import "markers/markers";
45
@import "handles/handles";
56
@import "minimap/minimap";
67
@import "react-flow_v12";

src/extensions/react-flow/edges/EdgeDefaultV12.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { EdgeDefaultDataProps, edgeDefaultUtils } from "./EdgeDefault";
1010
/**
1111
* @deprecated (v26) use EdgeDefaultDataProps
1212
*/
13-
type EdgeDefaultV12DataProps = Record<string, unknown> & EdgeDefaultDataProps;
13+
export type EdgeDefaultV12DataProps = Record<string, unknown> & EdgeDefaultDataProps;
1414
/**
1515
* @deprecated (v26) use EdgeDefaultProps
1616
*/
@@ -71,6 +71,8 @@ export const EdgeDefaultV12 = memo(
7171
/>
7272
) : null);
7373

74+
const appearance = "arrow-closed"; // test
75+
7476
return (
7577
<g
7678
className={
@@ -105,8 +107,16 @@ export const EdgeDefaultV12 = memo(
105107
<BaseEdge
106108
id={id}
107109
path={edgePath}
108-
markerStart={inversePath ? "url(#arrow-closed-reverse)" : undefined}
109-
markerEnd={!inversePath ? "url(#arrow-closed)" : undefined}
110+
markerStart={
111+
inversePath
112+
? `url(#react-flow__marker--${appearance}${intent ? `-${intent}` : "-none"}-reverse)`
113+
: undefined
114+
}
115+
markerEnd={
116+
!inversePath
117+
? `url(#react-flow__marker--${appearance}${intent ? `-${intent}` : "-none"}`
118+
: undefined
119+
}
110120
className={edgeDefaultUtils.createEdgeDefaultClassName({ strokeType })}
111121
interactionWidth={pathGlowWidth}
112122
style={{

src/extensions/react-flow/edges/EdgeDefs.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import React from "react";
22

3+
/**
4+
* @deprecated (v26) use `<ReactFlowMarkers /`
5+
*/
36
export const EdgeDefs = React.memo(() => (
47
<svg style={{ position: "absolute", top: 0, left: 0 }}>
58
<defs>

src/extensions/react-flow/edges/stories/EdgeDefaultV12.stories.tsx

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
import React, { useCallback, useState } from "react";
22
import { Meta, StoryFn } from "@storybook/react";
3-
import { addEdge, Edge, OnConnect, Position, ReactFlow, useEdgesState, useNodesState } from "@xyflow/react";
3+
import { addEdge, Edge, Node, OnConnect, Position, useEdgesState, useNodesState } from "@xyflow/react";
44

5-
import { NodeDefaultV12 } from "../../nodes/NodeDefaultV12";
6-
import { EdgeDefaultV12, EdgeDefaultV12DataProps as EdgeData } from "../EdgeDefaultV12";
7-
import { EdgeDefs } from "../EdgeDefs";
8-
9-
import { EdgeLabel, EdgeLabelObject } from "./../../../../../index";
5+
import {
6+
EdgeDefaultV12,
7+
EdgeDefaultV12DataProps as EdgeData,
8+
EdgeLabel,
9+
EdgeLabelObject,
10+
ReactFlowExtended,
11+
ReactFlowVersions,
12+
} from "./../../../../../index";
1013

1114
/**
1215
* this is only a mock to get it as sub element in the table
@@ -16,12 +19,6 @@ const EdgeDefaultDataProps = (data: EdgeData) => {
1619
return <></>;
1720
};
1821

19-
const edgeTypes = {
20-
default: EdgeDefaultV12,
21-
};
22-
const nodeTypes = {
23-
default: NodeDefaultV12,
24-
};
2522
export default {
2623
title: "Extensions/React Flow V12/Edge",
2724
component: EdgeDefaultV12,
@@ -76,17 +73,11 @@ const EdgeDefault = (args: Edge) => {
7673
},
7774
position: { x: 600, y: 200 },
7875
},
79-
]);
76+
] as Node[]);
8077

8178
const [edges, setEdges, onEdgesChange] = useEdgesState([
8279
{
8380
...args,
84-
// sourceX: 150,
85-
// sourceY: 0,
86-
// targetX: 250,
87-
// targetY: 0,
88-
sourcePosition: Position.Left,
89-
targetPosition: Position.Right,
9081
},
9182
]);
9283

@@ -102,17 +93,16 @@ const EdgeDefault = (args: Edge) => {
10293
);
10394

10495
return (
105-
<div style={{ width: "1000px", height: "800px" }}>
106-
<EdgeDefs />
107-
<ReactFlow
96+
<div style={{ height: "400px" }}>
97+
<ReactFlowExtended
98+
flowVersion={ReactFlowVersions.V12}
10899
nodes={nodes}
109100
edges={edges}
110101
onLoad={onLoad}
111-
edgeTypes={edgeTypes}
112-
nodeTypes={nodeTypes}
113102
onNodesChange={onNodesChange}
114103
onEdgesChange={onEdgesChange}
115104
onConnect={onConnect}
105+
defaultZoom={1}
116106
/>
117107
</div>
118108
);

src/extensions/react-flow/markers/MarkerArrowClosedInverse.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import React, { FC } from "react";
22

3+
/**
4+
* @deprecated (v26) only necessary for react flow v9, support will be removed
5+
*/
36
export const MarkerArrowClosedInverse: FC = () => {
47
return (
58
<marker
Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,73 @@
11
import React, { FC } from "react";
22

3+
import { intentClassName, IntentTypes } from "../../../common/Intent";
4+
import { CLASSPREFIX as eccgui } from "../../../configuration/constants";
5+
36
// FIXME: we need to check how these markers are used and if we can justify the namings
47
import { MarkerArrowClosedInverse } from "./MarkerArrowClosedInverse";
58

9+
type ReactFlowMarkerAppearance = "arrow-closed";
10+
11+
interface ReactFlowMarkerProps extends React.SVGProps<SVGMarkerElement> {
12+
/**
13+
* Visual appearance of the marker.
14+
*/
15+
appearance?: ReactFlowMarkerAppearance;
16+
/**
17+
* Feedback state of the marker.
18+
* SVG markers are reused by paths but they cannot inherit their state color automatically.
19+
*/
20+
intent?: IntentTypes;
21+
/**
22+
* If set, then the marker orientation is reversed.
23+
* Can be used if a start marker should displayed similar to an end marker.
24+
*/
25+
reverse?: boolean;
26+
}
27+
28+
const ReactFlowMarker = ({ className, appearance = "arrow-closed", intent, reverse }: ReactFlowMarkerProps) => {
29+
const markerDisplay: Record<ReactFlowMarkerAppearance, unknown> = {
30+
"arrow-closed": (
31+
<path d="M-5,-4 L5,0 L-5,4 Z" fill="currentColor" stroke-linecap="round" stroke-linejoin="round" />
32+
),
33+
};
34+
35+
return (
36+
<marker
37+
id={`react-flow__marker--${appearance}${intent ? `-${intent}` : ""}${reverse ? "-reverse" : ""}`}
38+
className={
39+
`${eccgui}-graphviz__marker` +
40+
(className ? ` ${className}` : "") +
41+
(intent ? ` ${intentClassName(intent)}` : "")
42+
}
43+
markerWidth="12.5"
44+
markerHeight="12.5"
45+
viewBox="-10 -10 20 20"
46+
refX="0"
47+
refY="0"
48+
orient={reverse ? "auto-start-reverse" : "auto"}
49+
>
50+
{markerDisplay[appearance]}
51+
</marker>
52+
);
53+
};
54+
655
const ReactFlowMarkers: FC = () => {
56+
const intents = ["none", "primary", "success", "warning", "danger", "info"] as IntentTypes[];
57+
758
return (
859
<svg>
960
<defs>
1061
<MarkerArrowClosedInverse />
62+
{intents.map((intent) => (
63+
<>
64+
<ReactFlowMarker appearance="arrow-closed" intent={intent} />
65+
<ReactFlowMarker appearance="arrow-closed" intent={intent} reverse />
66+
</>
67+
))}
1168
</defs>
1269
</svg>
1370
);
1471
};
1572

16-
export { MarkerArrowClosedInverse, ReactFlowMarkers };
73+
export { MarkerArrowClosedInverse, ReactFlowMarkers, ReactFlowMarker };
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
marker[id|="react-flow__marker"] {
2+
color: var(--marker-intent-color);
3+
4+
&.#{$eccgui}-intent--none {
5+
--marker-intent-color: #{$reactflow-edge-stroke-color-default};
6+
}
7+
8+
&.#{$eccgui}-intent--primary {
9+
--marker-intent-color: #{$eccgui-color-primary};
10+
}
11+
12+
&.#{$eccgui}-intent--info {
13+
--marker-intent-color: #{$eccgui-color-info-text};
14+
}
15+
16+
&.#{$eccgui}-intent--success {
17+
--marker-intent-color: #{$eccgui-color-success-text};
18+
}
19+
20+
&.#{$eccgui}-intent--warning {
21+
--marker-intent-color: #{$eccgui-color-warning-text};
22+
}
23+
24+
&.#{$eccgui}-intent--danger {
25+
--marker-intent-color: #{$eccgui-color-danger-text};
26+
}
27+
}

0 commit comments

Comments
 (0)