react-tree-graph
Version:
A react library for generating a graphical tree from data using d3
67 lines (57 loc) • 1.93 kB
JavaScript
import PropTypes from 'prop-types';
import React from 'react';
import wrapHandlers from '../wrapHandlers';
export default function Node(props) {
function getTransform() {
return `translate(${props.x}, ${props.y})`;
}
let offset = 0.5;
let nodePropsWithDefaults = props.nodeProps;
switch (props.shape) {
case 'circle':
nodePropsWithDefaults = { r: 5, ...nodePropsWithDefaults };
offset += nodePropsWithDefaults.r;
break;
case 'image':
case 'rect':
nodePropsWithDefaults = { height: 10, width: 10, ...nodePropsWithDefaults };
nodePropsWithDefaults = { x: -nodePropsWithDefaults.width / 2, y: -nodePropsWithDefaults.height / 2, ...nodePropsWithDefaults };
offset += nodePropsWithDefaults.width / 2;
break;
}
if (props.direction === 'rtl') {
offset = -offset;
}
const wrappedNodeProps = wrapHandlers(
nodePropsWithDefaults,
props[props.keyProp]
);
const wrappedGProps = wrapHandlers(
props.gProps,
props[props.keyProp]
);
const wrappedTextProps = wrapHandlers(
props.textProps,
props[props.keyProp]
);
const label = typeof props[props.labelProp] === 'string'
? <text dx={offset} dy={5} {...wrappedTextProps}>{props[props.labelProp]}</text>
: <g transform={`translate(${offset}, 5)`} {...wrappedTextProps}>{props[props.labelProp]}</g>;
return (
<g {...wrappedGProps} transform={getTransform()} direction={props.direction === 'rtl' ? 'rtl' : null}>
<props.shape {...wrappedNodeProps}/>
{ label }
</g>
);
}
Node.propTypes = {
x: PropTypes.number.isRequired,
y: PropTypes.number.isRequired,
keyProp: PropTypes.string.isRequired,
labelProp: PropTypes.string.isRequired,
direction: PropTypes.oneOf(['ltr', 'rtl']).isRequired,
shape: PropTypes.string.isRequired,
nodeProps: PropTypes.object.isRequired,
gProps: PropTypes.object.isRequired,
textProps: PropTypes.object.isRequired
};