feat(utils): create helper function for creating edges

This commit is contained in:
moklick
2019-10-08 19:30:04 +02:00
parent 48e9a8e75a
commit 8d19fc9824
5 changed files with 31 additions and 23 deletions
+5 -11
View File
@@ -1,13 +1,11 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import Graph, { isEdge, removeElements, getOutgoers, MiniMap, Controls } from '../../../src'; import Graph, { isEdge, removeElements, addEdge, getOutgoers, MiniMap, Controls } from '../../../src';
import SpecialNode from './SpecialNode'; import SpecialNode from './SpecialNode';
import InputNode from './InputNode'; import InputNode from './InputNode';
const onNodeDragStop = node => console.log('drag stop', node); const onNodeDragStop = node => console.log('drag stop', node);
let edgeId = 0;
const getEdgeId = () => `edge__${edgeId++}`;
class App extends PureComponent { class App extends PureComponent {
constructor() { constructor() {
@@ -74,9 +72,6 @@ class App extends PureComponent {
{ id: 'e6-7', source: '6', target: '7', style: { stroke: '#FFCC00' }}, { id: 'e6-7', source: '6', target: '7', style: { stroke: '#FFCC00' }},
] ]
}; };
this.onElementClick = this.onElementClick.bind(this);
this.onConnect = this.onConnect.bind(this);
} }
onLoad(graphInstance) { onLoad(graphInstance) {
@@ -120,14 +115,13 @@ class App extends PureComponent {
onElementsRemove(elementsToRemove) { onElementsRemove(elementsToRemove) {
this.setState(prevState => ({ this.setState(prevState => ({
elements: removeElements(prevState.elements, elementsToRemove) elements: removeElements(elementsToRemove, prevState.elements)
})); }));
} }
onConnect(params) { onConnect(params) {
console.log('connect', params);
this.setState(prevState => ({ this.setState(prevState => ({
elements: prevState.elements.concat({ id: getEdgeId(), ...params }) elements: addEdge(params, prevState.elements)
})); }));
} }
@@ -135,9 +129,9 @@ class App extends PureComponent {
return ( return (
<Graph <Graph
elements={this.state.elements} elements={this.state.elements}
onElementClick={this.onElementClick} onElementClick={element => this.onElementClick(element)}
onElementsRemove={elements => this.onElementsRemove(elements)} onElementsRemove={elements => this.onElementsRemove(elements)}
onConnect={this.onConnect} onConnect={params => this.onConnect(params)}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
style={{ width: '100%', height: '100%' }} style={{ width: '100%', height: '100%' }}
onLoad={graphInstance => this.onLoad(graphInstance)} onLoad={graphInstance => this.onLoad(graphInstance)}
+5 -11
View File
@@ -1,12 +1,9 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import Graph, { removeElements, getOutgoers } from '../../../src'; import Graph, { removeElements, addEdge, getOutgoers } from '../../../src';
const onNodeDragStop = node => console.log('drag stop', node); const onNodeDragStop = node => console.log('drag stop', node);
let edgeId = 0;
const getEdgeId = () => `edge__${edgeId++}`;
class App extends PureComponent { class App extends PureComponent {
constructor() { constructor() {
super(); super();
@@ -22,9 +19,6 @@ class App extends PureComponent {
{ id: 'e1-3', source: '1', target: '3' }, { id: 'e1-3', source: '1', target: '3' },
] ]
}; };
this.onElementClick = this.onElementClick.bind(this);
this.onConnect = this.onConnect.bind(this);
} }
onLoad(graphInstance) { onLoad(graphInstance) {
@@ -43,14 +37,14 @@ class App extends PureComponent {
onElementsRemove(elementsToRemove) { onElementsRemove(elementsToRemove) {
this.setState(prevState => ({ this.setState(prevState => ({
elements: removeElements(prevState.elements, elementsToRemove) elements: removeElements(elementsToRemove, prevState.elements)
})); }));
} }
onConnect(params) { onConnect(params) {
console.log('connect', params); console.log('connect', params);
this.setState(prevState => ({ this.setState(prevState => ({
elements: prevState.elements.concat({ id: getEdgeId(), ...params }) elements: addEdge(params, prevState.elements)
})); }));
} }
@@ -59,9 +53,9 @@ class App extends PureComponent {
<Graph <Graph
elements={this.state.elements} elements={this.state.elements}
onLoad={graphInstance => this.onLoad(graphInstance)} onLoad={graphInstance => this.onLoad(graphInstance)}
onElementClick={this.onElementClick} onElementClick={element => this.onElementClick(element)}
onElementsRemove={elements => this.onElementsRemove(elements)} onElementsRemove={elements => this.onElementsRemove(elements)}
onConnect={this.onConnect} onConnect={params => this.onConnect(params)}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
style={{ width: '100%', height: '100%' }} style={{ width: '100%', height: '100%' }}
showBackground={false} showBackground={false}
+1
View File
@@ -10,5 +10,6 @@ export {
isNode, isNode,
isEdge, isEdge,
removeElements, removeElements,
addEdge,
getOutgoers getOutgoers
} from './utils/graph'; } from './utils/graph';
+18 -1
View File
@@ -1,5 +1,7 @@
import { zoomIdentity } from 'd3-zoom'; import { zoomIdentity } from 'd3-zoom';
import store from '../store'; import store from '../store';
import { isDefined } from './index';
export const isEdge = element => element.source && element.target; export const isEdge = element => element.source && element.target;
@@ -14,7 +16,7 @@ export const getOutgoers = (node, elements) => {
return elements.filter(e => outgoerIds.includes(e.id)); return elements.filter(e => outgoerIds.includes(e.id));
}; };
export const removeElements = (elements, elementsToRemove) => { export const removeElements = (elementsToRemove, elements) => {
const nodeIdsToRemove = elementsToRemove.map(n => n.id); const nodeIdsToRemove = elementsToRemove.map(n => n.id);
return elements.filter(e => { return elements.filter(e => {
@@ -26,6 +28,21 @@ export const removeElements = (elements, elementsToRemove) => {
}); });
}; };
function getEdgeId(params) {
return `reactflow__edge-${params.source}-${params.target}`;
}
export const addEdge = (edgeParams, elements) => {
if (!edgeParams.source || !edgeParams.target) {
throw new Error('Can not create edge. An edge needs a source and a target');
}
return elements.concat({
...edgeParams,
id: isDefined(edgeParams.id) ? edgeParams.id : getEdgeId(edgeParams)
});
}
const pointToRendererPoint = ({ x, y }, transform) => { const pointToRendererPoint = ({ x, y }, transform) => {
const rendererX = (x - transform[0]) * (1 / [transform[2]]); const rendererX = (x - transform[0]) * (1 / [transform[2]]);
const rendererY = (y - transform[1]) * (1 / [transform[2]]); const rendererY = (y - transform[1]) * (1 / [transform[2]]);
+2
View File
@@ -1,5 +1,7 @@
export const isFunction = obj => !!(obj && obj.constructor && obj.call && obj.apply); export const isFunction = obj => !!(obj && obj.constructor && obj.call && obj.apply);
export const isDefined = obj => typeof obj !== 'undefined';
export const inInputDOMNode = e => e && e.target && ['INPUT', 'SELECT', 'TEXTAREA'].includes(e.target.nodeName); export const inInputDOMNode = e => e && e.target && ['INPUT', 'SELECT', 'TEXTAREA'].includes(e.target.nodeName);
export const getDimensions = (node = {}) => ({ export const getDimensions = (node = {}) => ({