infect-frontend
Version:
infect fronend
78 lines (66 loc) • 3.12 kB
JSX
import React from 'react';
import { observer } from 'mobx-react';
import { numberWithThousandsSeparators } from '../../helpers/formatters';
import { supportsDominantBaseline } from '../../helpers/svgPolyfill';
import { computed } from 'mobx';
import debug from 'debug';
const log = debug('infect:ResistanceDetailComponent');
class ResistanceDetail extends React.Component {
constructor() {
super();
this._radius = 40;
}
get transformation() {
log('Get transformation for resistanceDetail');
// Make sure resistanceDetail is not hidden behind matrix header (which has a higher z-index
// due to it's fixed position when scrolling).
const correctTop = this.props.resistance.yPosition.top + this.props.defaultRadius;
const top = Math.max(correctTop, this._radius);
return `translate(${ this.props.resistance.xPosition.left + this.props.defaultRadius },
${ top })`;
}
render() {
return(
<g transform={ this.transformation } className="resistanceMatrix__resistanceDetail">
{ /* Definition for blur filter (drop shadow) */ }
<defs>
{ /* https://stackoverflow.com/questions/6555600/gaussian-blur-cutoff-at-edges */ }
<filter id="resistanceDetailBlur" x="-50%" y="-50%" width="200%" height="200%">
<feGaussianBlur in="SourceGraphic" stdDeviation="5" />
</filter>
</defs>
{ /* Shadow – placed before real circle to be behind it */ }
<circle r={ this._radius } filter="url(#resistanceDetailBlur)"
className="resistanceMatrix__resistanceDetailCircleShadow">
</circle>
{ /* Background cirlce */ }
<circle r={ this._radius } fill={ this.props.resistance.backgroundColor }
className="resistanceMatrix__resistanceDetailCircle">
</circle>
{ /* Value */ }
{ /* dy -2: Adobe's font is not correctly middled, adjust by 2 px */ }
<text fill={ this.props.resistance.fontColor } dominantBaseline="alphabetical" textAnchor="middle"
dy={ supportsDominantBaseline('-0.4em', '-0.4em')} dx="2"
className="resistanceMatrix__resistanceDetailValueText">
{Math.round((1 - this.props.resistance.mostPreciseValue.value) * 100)}
<tspan className="resistanceMatrix__resistanceDetailValuePercentSign">%</tspan>
</text>
{ /* Confidence Interval */ }
<text fill={ this.props.resistance.fontColor } dominantBaseline="hanging" textAnchor="middle"
dy={ supportsDominantBaseline('-0.4em', '0.5em')}
className="resistanceMatrix__resistanceDetailSampleSizeText">
CI { Math.round((1 - this.props.resistance.mostPreciseValue.confidenceInterval[1]) * 100) }–
{ Math.round((1 - this.props.resistance.mostPreciseValue.confidenceInterval[0]) * 100) }%
</text>
{ /* Sample Size */ }
<text fill={ this.props.resistance.fontColor } dominantBaseline="hanging" textAnchor="middle"
dy={ supportsDominantBaseline('0.6em', '1.5em')}
className="resistanceMatrix__resistanceDetailSampleSizeText">
N={ numberWithThousandsSeparators(this.props.resistance.mostPreciseValue.sampleSize) }
</text>
</g>
);
}
}
export default ResistanceDetail;