ui/perfherder/alerts/Magnitude.jsx (59 lines of code) (raw):
import React from 'react';
import PropTypes from 'prop-types';
import numeral from 'numeral';
import ProgressBar from '../../shared/ProgressBar';
import SimpleTooltip from '../../shared/SimpleTooltip';
import { formatNumber } from '../perf-helpers/helpers';
export default class Magnitude extends React.PureComponent {
// arbitrary scale from 0-20% multiplied by 5, capped
// at 100 (so 20% regression === 100% bad)
getCappedMagnitude = (percent) => Math.min(Math.abs(percent) * 5, 100);
abbreviateNumber = (num) =>
numeral(num).format('0.0a').toString().toUpperCase();
render() {
const { alert } = this.props;
return (
<div className="d-flex align-items-end justify-content-center">
<div
className="w-50 text-right text-nowrap"
data-testid="previous-value"
>
<SimpleTooltip
textClass="detail-hint"
text={this.abbreviateNumber(alert.prev_value)}
tooltipText={`Previous value: ${formatNumber(alert.prev_value)}`}
autohide={false}
/>
</div>
<div className="d-flex flex-column">
<div className="align-self-center pb-1">
<SimpleTooltip
textClass="detail-hint"
text={`${alert.amount_pct}%`}
tooltipText={`Absolute difference: ${alert.amount_abs}`}
autohide={false}
/>
</div>
<div className="px-2 table-width-lg align-self-center">
<ProgressBar
magnitude={this.getCappedMagnitude(alert.amount_pct)}
regression={alert.is_regression}
color={!alert.is_regression ? 'success' : 'danger'}
/>
</div>
</div>
<div className="w-50 text-nowrap" data-testid="new-value">
<SimpleTooltip
textClass="detail-hint"
text={this.abbreviateNumber(alert.new_value)}
tooltipText={`New value: ${formatNumber(alert.new_value)}`}
autohide={false}
/>
</div>
</div>
);
}
}
Magnitude.propTypes = {
alert: PropTypes.shape({}).isRequired,
};