Files
weave-scope/client/app/scripts/charts/node-shape-hex.js
Simon Howe 9d968a789b Tidying up MoC
- no rand ids, org code
- Fixes tests, no .includes in jest for now
- Small comment on moc stuff
- Patch up differences after MoC rebase
2016-04-04 17:48:44 +02:00

73 lines
1.9 KiB
JavaScript

import React from 'react';
import d3 from 'd3';
import classNames from 'classnames';
import {getMetricValue, getMetricColor} from '../utils/metric-utils.js';
import {CANVAS_METRIC_FONT_SIZE} from '../constants/styles.js';
const line = d3.svg.line()
.interpolate('cardinal-closed')
.tension(0.25);
function getWidth(h) {
return (Math.sqrt(3) / 2) * h;
}
function getPoints(h) {
const w = getWidth(h);
const points = [
[w * 0.5, 0],
[w, 0.25 * h],
[w, 0.75 * h],
[w * 0.5, h],
[0, 0.75 * h],
[0, 0.25 * h]
];
return line(points);
}
export default function NodeShapeHex({id, highlighted, size, color, metric}) {
const pathProps = v => ({
d: getPoints(size * v * 2),
transform: `rotate(90) translate(-${size * getWidth(v)}, -${size * v})`
});
const shadowSize = 0.45;
const upperHexBitHeight = -0.25 * size * shadowSize;
const fontSize = size * CANVAS_METRIC_FONT_SIZE;
const clipId = `mask-${id}`;
const {height, value, formattedValue} = getMetricValue(metric, size);
const className = classNames('shape', {
metrics: value !== null
});
const metricStyle = {
fill: getMetricColor(metric)
};
return (
<g className={className}>
<defs>
<clipPath id={clipId}>
<rect
width={size}
height={size}
x={size - height + upperHexBitHeight}
/>
</clipPath>
</defs>
{highlighted && <path className="highlighted" {...pathProps(0.7)} />}
<path className="border" stroke={color} {...pathProps(0.5)} />
<path className="shadow" {...pathProps(shadowSize)} />
<path className="metric-fill" style={metricStyle}
clipPath={`url(#${clipId})`} {...pathProps(shadowSize)} />
{highlighted && value !== null ?
<text style={{fontSize}}>
{formattedValue}
</text> :
<circle className="node" r={Math.max(2, (size * 0.125))} />}
</g>
);
}