Gathering detailed insights and metrics for react-digraph
Gathering detailed insights and metrics for react-digraph
Gathering detailed insights and metrics for react-digraph
Gathering detailed insights and metrics for react-digraph
npm install react-digraph
Typescript
Module System
Min. Node Version
Node Version
NPM Version
JavaScript (97.5%)
SCSS (2.19%)
HTML (0.31%)
Total Downloads
0
Last Day
0
Last Week
0
Last Month
0
Last Year
0
MIT License
2,641 Stars
474 Commits
267 Forks
1,453 Watchers
25 Branches
45 Contributors
Updated on Jul 10, 2025
Latest Version
9.1.2
Package Id
react-digraph@9.1.2
Unpacked Size
2.11 MB
Size
548.86 kB
File Count
16
NPM Version
8.5.5
Node Version
16.15.0
Published on
Sep 05, 2023
Cumulative downloads
Total Downloads
Last Day
0%
NaN
Compared to previous day
Last Week
0%
NaN
Compared to previous week
Last Month
0%
NaN
Compared to previous month
Last Year
0%
NaN
Compared to previous year
7
70
A React component which makes it easy to create a directed graph editor without implementing any of the SVG drawing or event handling logic.
Version 8.0.0 introduces multi-select nodes and edges using Ctrl-Shift-Mouse events (Cmd-Shift-mouse for Mac). This requires a breaking change. Instead of onSelectNode/Edge, you'll only provide one onSelect function callback and a selected
object with { nodes: Map, and edges: Map }
as the parameter format. The typings folder has the exact type definition for these attributes. When either edges or nodes are selected the onSelect function will fire with the object. You will have to handle all nodes and edges selected, or if there is only one then you will have to determine if it's a node or edge within the onSelect function.
To disable multi-select you can set allowMultiselect
to false
, which disables the Ctrl-Shift-mouse event, but we will still use the onSelect
function. Both onSelectNode
and onSelectEdge
are deprecated.
Breaking changes:
onPasteSelected
now accepts a SelectionT
object for the first parameteronPasteSelected
now accepts an IPoint
instead
of a XYCoords
array for the second parameter.onDeleteSelected
is added which takes a SelectionT
parameter.onSelect
is added, which accepts SelectionT
and Event
parameters.onUpdateNode
accepts a Map of updated nodes in the second parameter (for example, if multiple nodes are moved).selected
is a new property to track selected nodes and edges. It is a SelectionT
type.canDeleteSelected
takes the place of canDeleteNode
and canDeleteEdge
. It accepts a SelectionT
type as a parameter.onDeleteNode
is removedonDeleteEdge
is removedselectedNode
is removedselectedEdge
is removedcanDeleteNode
is removedcanDeleteEdge
is removedselectedNodes
is removedselectedEdges
is removed1npm install --save react-digraph
If you don't have the following peerDependenies, make sure to install them:
1npm install --save react react-dom
The default export is a component called GraphView
; it provides a multitude of hooks for various graph editing operations and a set of controls for zooming. Typically, it should be wrapped in a higher order component that supplies various callbacks (onCreateNode
, onCreateEdge
etc...).
GraphView
expects several properties to exist on your nodes and edges. If these types conflict with existing properties on your data, you must transform your data to re-key these properties under different names and to add the expected properties. All nodes and edges can have a type
attribute set - nodes also support a subtype
attribute. For a full description of node and edge properties, see the sections for INode
and IEdge
below.
Configuration for nodes and edges can be passed to GraphView
via the nodeTypes
, nodeSubtypes
, and edgeTypes
props. Custom SVG elements can be defined here for the node's type/subtype and the edge's type.
It is often convenient to combine these types into a configuration object that can be referred to elsewhere in the application and used to associate events fired from nodes/edges in the GraphView
with other actions in the application. Here is an abbreviated example:
1import { 2 GraphView, // required 3 Edge, // optional 4 type IEdge, // optional 5 Node, // optional 6 type INode, // optional 7 type LayoutEngineType, // required to change the layoutEngineType, otherwise optional 8 BwdlTransformer, // optional, Example JSON transformer 9 GraphUtils // optional, useful utility functions 10} from 'react-digraph'; 11 12const GraphConfig = { 13 NodeTypes: { 14 empty: { // required to show empty nodes 15 typeText: "None", 16 shapeId: "#empty", // relates to the type property of a node 17 shape: ( 18 <symbol viewBox="0 0 100 100" id="empty" key="0"> 19 <circle cx="50" cy="50" r="45"></circle> 20 </symbol> 21 ) 22 }, 23 custom: { // required to show empty nodes 24 typeText: "Custom", 25 shapeId: "#custom", // relates to the type property of a node 26 shape: ( 27 <symbol viewBox="0 0 50 25" id="custom" key="0"> 28 <ellipse cx="50" cy="25" rx="50" ry="25"></ellipse> 29 </symbol> 30 ) 31 } 32 }, 33 NodeSubtypes: {}, 34 EdgeTypes: { 35 emptyEdge: { // required to show empty edges 36 shapeId: "#emptyEdge", 37 shape: ( 38 <symbol viewBox="0 0 50 50" id="emptyEdge" key="0"> 39 <circle cx="25" cy="25" r="8" fill="currentColor"> </circle> 40 </symbol> 41 ) 42 } 43 } 44} 45 46const NODE_KEY = "id" // Allows D3 to correctly update DOM 47 48class Graph extends Component { 49 50 constructor(props) { 51 super(props); 52 53 this.state = { 54 graph: sample, 55 selected: {} 56 } 57 } 58 59 /* Define custom graph editing methods here */ 60 61 render() { 62 const nodes = this.state.graph.nodes; 63 const edges = this.state.graph.edges; 64 const selected = this.state.selected; 65 66 const NodeTypes = GraphConfig.NodeTypes; 67 const NodeSubtypes = GraphConfig.NodeSubtypes; 68 const EdgeTypes = GraphConfig.EdgeTypes; 69 70 return ( 71 <div id='graph' style={styles.graph}> 72 73 <GraphView ref='GraphView' 74 nodeKey={NODE_KEY} 75 nodes={nodes} 76 edges={edges} 77 selected={selected} 78 nodeTypes={NodeTypes} 79 nodeSubtypes={NodeSubtypes} 80 edgeTypes={EdgeTypes} 81 allowMultiselect={true} // true by default, set to false to disable multi select. 82 onSelect={this.onSelect} 83 onCreateNode={this.onCreateNode} 84 onUpdateNode={this.onUpdateNode} 85 onDeleteNode={this.onDeleteNode} 86 onCreateEdge={this.onCreateEdge} 87 onSwapEdge={this.onSwapEdge} 88 onDeleteEdge={this.onDeleteEdge}/> 89 </div> 90 ); 91 } 92 93}
A typical graph that would be stored in the Graph component's state looks something like this:
1{ 2 "nodes": [ 3 { 4 "id": 1, 5 "title": "Node A", 6 "x": 258.3976135253906, 7 "y": 331.9783248901367, 8 "type": "empty" 9 }, 10 { 11 "id": 2, 12 "title": "Node B", 13 "x": 593.9393920898438, 14 "y": 260.6060791015625, 15 "type": "empty" 16 }, 17 { 18 "id": 3, 19 "title": "Node C", 20 "x": 237.5757598876953, 21 "y": 61.81818389892578, 22 "type": "custom" 23 }, 24 { 25 "id": 4, 26 "title": "Node C", 27 "x": 600.5757598876953, 28 "y": 600.81818389892578, 29 "type": "custom" 30 } 31 ], 32 "edges": [ 33 { 34 "source": 1, 35 "target": 2, 36 "type": "emptyEdge" 37 }, 38 { 39 "source": 2, 40 "target": 4, 41 "type": "emptyEdge" 42 } 43 ] 44} 45
For a detailed example, check out src/examples/graph.js. To run the example:
1npm install 2npm run example
A webpage will open in your default browser automatically.
All props are detailed below.
Prop | Type | Required | Notes |
---|---|---|---|
nodeKey | string | true | Key for D3 to update nodes(typ. UUID). |
nodes | Array<INode> | true | Array of graph nodes. |
edges | Array<IEdge> | true | Array of graph edges. |
allowCopyEdges | boolean | false | (default false) Allow onCopySelected to be called when an edge is selected without any nodes. |
allowMultiselect | boolean | false | (default true) Use Ctrl-Shift-LeftMouse to draw a multiple selection box. |
selected | object | true | The currently selected graph entity. |
nodeTypes | object | true | Config object of available node types. |
nodeSubtypes | object | true | Config object of available node subtypes. |
edgeTypes | object | true | Config object of available edge types. |
onSelect | func | false | Called when nodes are selected when allowMultiselect is true. Is passed an object with nodes and edges included. |
onCreateNode | func | true | Called when a node is created. |
onContextMenu | func | true | Called when contextmenu event triggered. |
onUpdateNode | func | true | Called when a node is moved. |
onCreateEdge | func | true | Called when an edge is created. |
onSwapEdge | func | true | Called when an edge 'target' is swapped. |
onBackgroundClick | func | false | Called when the background is clicked. |
onArrowClicked | func | false | Called when the arrow head is clicked. |
onUndo | func | false | A function called when Ctrl-Z is activated. React-digraph does not keep track of actions, this must be implemented in the client website. |
onCopySelected | func | false | A function called when Ctrl-C is activated. React-digraph does not keep track of copied nodes or edges, the this must be implemented in the client website. |
onPasteSelected | func | false | A function called when Ctrl-V is activated. React-digraph does not keep track of copied nodes or edges, the this must be implemented in the client website. |
canDeleteSelected | func | false | takes the place of canDeleteNode and canDeleteEdge . It accepts a SelectionT type as a parameter. It is called before a node or edge is deleted. The function should return a boolean. |
canCreateEdge | func | false | Called before an edge is created. |
canSwapEdge | func | false | Called before an edge 'target' is swapped. |
afterRenderEdge | func | false | Called after an edge is rendered. |
renderNode | func | false | Called to render node geometry. |
renderNodeText | func | false | Called to render the node text |
renderDefs | func | false | Called to render SVG definitions. |
renderBackground | func | false | Called to render SVG background. |
readOnly | bool | false | Disables all graph editing interactions. |
disableBackspace | bool | false | Disables using backspace to delete the selected node. |
maxTitleChars | number | false | Truncates node title characters. |
gridSize | number | false | Overall grid size. |
gridSpacing | number | false | Grid spacing. |
gridDotSize | number | false | Grid dot size. |
minZoom | number | false | Minimum zoom percentage. |
maxZoom | number | false | Maximum zoom percentage. |
nodeSize | number | false | Node bbox size. |
edgeHandleSize | number | false | Edge handle size. |
edgeArrowSize | number | false | Edge arrow size in pixels. Default 8. Set to 0 to hide arrow. |
zoomDelay | number | false | Delay before zoom occurs. |
zoomDur | number | false | Duration of zoom transition. |
showGraphControls | boolean | false | Whether to show zoom controls. |
layoutEngineType | typeof LayoutEngineType | false | Uses a pre-programmed layout engine, such as 'SnapToGrid' |
rotateEdgeHandle | boolean | false | Whether to rotate edge handle with edge when a node is moved |
centerNodeOnMove | boolean | false | Whether the node should be centered on cursor when moving a node |
initialBBox | typeof IBBox | false | If specified, initial render graph using the given bounding box |
graphConfig | object | false | dagre graph setting configuration, which will override layout engine graph configuration - only apply to 'HorizontalTree' |
nodeSizeOverridesAllowed | boolean | false | Flag to toggle sizeOverride in nodes - only apply to 'HorizontalTree' |
nodeLocationOverrides | object | false | Nodes location overrides object - only apply to 'HorizontalTree' |
onCreateNode
You have access to d3
mouse event in onCreateNode
function.
1 onCreateNode = (x, y, mouseEvent) => { 2 // we can get the exact mouse position when click happens with this line 3 const {pageX, pageY} = mouseEvent; 4 // rest of the code for adding a new node ... 5 };
See prop types in the typings folder.
INode
Prop | Type | Required | Notes |
---|---|---|---|
anyIDKey | string | true | An id or key for nodes, same as the nodeKey prop |
title | string | true | Used in edges and to render the node text. |
x | number | false | X coordinate of the node. |
y | number | false | Y coordinate of the node. |
type | string | false | Node type, for displaying a custom SVG shape. |
subtype | string | false | Node subtype, for displaying a custom SVG shape. |
title
The title
attribute is used for the IDs in the SVG nodes in the graph.
IEdge
Prop | Type | Required | Notes |
---|---|---|---|
source | string | true | The title of the parent node. |
target | string | true | The title of the child node. |
type | string | false | Edge type, for displaying a custom SVG shape. |
handleText | string | false | Text to render on the edge. |
handleTooltipText | string | false | Used to render the SVG title element. |
label_from | string | false | Text to render along the edge with label_to . |
label_to | string | false | Text to render along the edge with label_from . |
You can call these methods on the GraphView class using a ref.
Method | Type | Notes |
---|---|---|
panToNode | (id: string, zoom?: boolean) => void | Center the node given by id within the viewport, optionally zoom in to fit it. |
panToEdge | (source: string, target: string, zoom?: boolean) => void | Center the edge between source and target node IDs within the viewport, optionally zoom in to fit it. |
Prop | Type | Required | Notes |
---|---|---|---|
emptyType | string | true | 'Default' node type. |
getViewNode | func | true | Node getter. |
renderEdge | func | false | Called to render edge geometry. |
enableFocus | bool | false | Adds a 'focus' toggle state to GraphView. |
transitionTime | number | false | Fade-in/Fade-out time. |
primary | string | false | Primary color. |
light | string | false | Light color. |
dark | string | false | Dark color. |
style | object | false | Style prop for wrapper. |
gridDot | number | false | Grid dot size. |
graphControls | boolean | true | Whether to show zoom controls. |
No vulnerabilities found.
Reason
no dangerous workflow patterns detected
Reason
no binaries found in the repo
Reason
0 existing vulnerabilities detected
Reason
license file detected
Details
Reason
Found 12/18 approved changesets -- score normalized to 6
Reason
0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
detected GitHub workflow tokens with excessive permissions
Details
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
dependency not pinned by hash detected -- score normalized to 0
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
project is not fuzzed
Details
Reason
security policy file not detected
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2025-07-07
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More