feat(nodetypes): custome types

This commit is contained in:
moklick
2019-07-16 13:06:47 +02:00
parent da1bf6f5ad
commit 587fb88fa3
7 changed files with 55 additions and 45 deletions
+3 -5
View File
@@ -1,13 +1,11 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import Graph from '../src'; import Graph from '../src';
import wrapNode from '../src/NodeRenderer/NodeTypes/wrapNode';
// import Graph from '../dist/ReactGraph'; // import Graph from '../dist/ReactGraph';
const SpecialNode = wrapNode(({ data }) => const SpecialNode = ({ data }) =>
<div>I am Special!<br />{data.label}</div> <div>I am Special!<br />{data.label}</div>
); ;
class App extends PureComponent { class App extends PureComponent {
constructor() { constructor() {
@@ -27,7 +25,7 @@ class App extends PureComponent {
{ data: { source: '3', target: '5' } }, { data: { source: '3', target: '5' } },
{ data: { source: '5', target: '6' } } { data: { source: '5', target: '6' } }
] ]
} };
} }
onLoad(graphInstance) { onLoad(graphInstance) {
+2 -3
View File
@@ -1,12 +1,11 @@
import React from 'react'; import React from 'react';
import wrapNode from './wrapNode';
import Handle from '../Handle'; import Handle from '../Handle';
export default wrapNode(({ data, style }) => ( export default ({ data, style }) => (
<div style={{ background: '#ff6060', padding: '10px', ...style }}> <div style={{ background: '#ff6060', padding: '10px', ...style }}>
<Handle style={{ top: 0 }} /> <Handle style={{ top: 0 }} />
{data.label} {data.label}
<Handle style={{ bottom: 0, top: 'auto', transform: 'translate(-50%, 50%)' }} /> <Handle style={{ bottom: 0, top: 'auto', transform: 'translate(-50%, 50%)' }} />
</div> </div>
)); );
+2 -3
View File
@@ -1,11 +1,10 @@
import React from 'react'; import React from 'react';
import wrapNode from './wrapNode';
import Handle from '../Handle'; import Handle from '../Handle';
export default wrapNode(({ data, style }) => ( export default ({ data, style }) => (
<div style={{ background: '#9999ff', padding: '10px', ...style }}> <div style={{ background: '#9999ff', padding: '10px', ...style }}>
{data.label} {data.label}
<Handle style={{ bottom: 0, top: 'auto', transform: 'translate(-50%, 50%)' }} /> <Handle style={{ bottom: 0, top: 'auto', transform: 'translate(-50%, 50%)' }} />
</div> </div>
)); );
+2 -3
View File
@@ -1,11 +1,10 @@
import React from 'react'; import React from 'react';
import wrapNode from './wrapNode';
import Handle from '../Handle'; import Handle from '../Handle';
export default wrapNode(({ data, style }) => ( export default ({ data, style }) => (
<div style={{ background: '#55ff99', padding: '10px', ...style }}> <div style={{ background: '#55ff99', padding: '10px', ...style }}>
<Handle style={{ top: 0 }} /> <Handle style={{ top: 0 }} />
{data.label} {data.label}
</div> </div>
)); );
+1 -28
View File
@@ -1,30 +1,11 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { Consumer } from '../GraphContext'; import { Consumer } from '../GraphContext';
import DefaultNode from './NodeTypes/DefaultNode';
import InputNode from './NodeTypes/InputNode';
import OutputNode from './NodeTypes/OutputNode';
class NodeRenderer extends PureComponent { class NodeRenderer extends PureComponent {
renderNode(d, onNodeClick) { renderNode(d, onNodeClick) {
const nodeType = d.data.type || 'default'; const nodeType = d.data.type || 'default';
let NodeComponent = null; const NodeComponent = this.props.nodeTypes[nodeType];
switch (nodeType) {
case 'input': {
NodeComponent = this.props.nodeTypes.input || InputNode; break;
}
case 'default': {
NodeComponent = this.props.nodeTypes.default || DefaultNode; break;
}
case 'output': {
NodeComponent = this.props.nodeTypes.output || OutputNode; break;
}
default: {
NodeComponent = this.props.nodeTypes[nodeType] || DefaultNode;
}
}
return ( return (
<NodeComponent <NodeComponent
@@ -55,12 +36,4 @@ class NodeRenderer extends PureComponent {
} }
} }
NodeRenderer.defaultProps = {
nodeTypes: {
input: InputNode,
default: DefaultNode,
output: OutputNode
}
};
export default NodeRenderer; export default NodeRenderer;
+26
View File
@@ -0,0 +1,26 @@
import DefaultNode from './NodeTypes/DefaultNode';
import InputNode from './NodeTypes/InputNode';
import OutputNode from './NodeTypes/OutputNode';
import wrapNode from './NodeTypes/wrapNode';
export function createNodeTypes(nodeTypes) {
const standardTypes = {
input: wrapNode(nodeTypes.input || InputNode),
default: wrapNode(nodeTypes.default || DefaultNode),
output: wrapNode(nodeTypes.output || OutputNode)
};
const specialTypes = Object
.keys(nodeTypes)
.filter(k => !['input', 'default', 'output'].includes(k))
.reduce((res, key) => {
res[key] = wrapNode(nodeTypes[key]);
return res;
}, {});
return {
...standardTypes,
...specialTypes
};
}
+19 -3
View File
@@ -3,13 +3,24 @@ import React, { PureComponent } from 'react';
import { separateElements } from './graph-utils'; import { separateElements } from './graph-utils';
import GraphView from './GraphView'; import GraphView from './GraphView';
import { Provider } from './GraphContext'; import { Provider } from './GraphContext';
import { createNodeTypes } from './NodeRenderer/utils';
import DefaultNode from './NodeRenderer/NodeTypes/DefaultNode';
import InputNode from './NodeRenderer/NodeTypes/InputNode';
import OutputNode from './NodeRenderer/NodeTypes/OutputNode';
import './style.css'; import './style.css';
class ReactGraph extends PureComponent { class ReactGraph extends PureComponent {
constructor(props) {
super(props);
this.nodeTypes = createNodeTypes(props.nodeTypes);
}
render() { render() {
const { const {
style, onNodeClick, children, onLoad, onMove, onChange, elements, nodeTypes style, onNodeClick, children, onLoad, onMove, onChange, elements
} = this.props; } = this.props;
const { nodes, edges } = separateElements(elements); const { nodes, edges } = separateElements(elements);
@@ -21,7 +32,7 @@ class ReactGraph extends PureComponent {
onLoad={onLoad} onLoad={onLoad}
onMove={onMove} onMove={onMove}
onChange={onChange} onChange={onChange}
nodeTypes={nodeTypes} nodeTypes={this.nodeTypes}
/> />
{children} {children}
</Provider> </Provider>
@@ -34,7 +45,12 @@ ReactGraph.defaultProps = {
onNodeClick: () => {}, onNodeClick: () => {},
onLoad: () => {}, onLoad: () => {},
onMove: () => {}, onMove: () => {},
onChange: () => {} onChange: () => {},
nodeTypes: {
input: InputNode,
default: DefaultNode,
output: OutputNode
}
}; };
export default ReactGraph; export default ReactGraph;