blob: ca6e799c8c545c3cb257a36a17af39a04a8ae170 [file] [log] [blame]
class RatioBarGraph extends ComponentBase {
constructor()
{
super('ratio-bar-graph');
this._ratio = null;
this._label = null;
this._shouldRender = true;
this._ratioBarGraph = this.content().querySelector('.ratio-bar-graph');
}
update(ratio, label, showWarningIcon)
{
console.assert(typeof(ratio) == 'number');
this._ratio = ratio;
this._label = label;
this._showWarningIcon = showWarningIcon;
this._shouldRender = true;
}
render()
{
if (!this._shouldRender)
return;
this._shouldRender = false;
var element = ComponentBase.createElement;
var children = [element('div', {class: 'separator'})];
if (this._showWarningIcon) {
if (this._ratio && this._ratio < -0.4)
this._ratioBarGraph.classList.add('warning-on-right');
else
this._ratioBarGraph.classList.remove('warning-on-right');
children.push(new WarningIcon);
}
var barClassName = 'bar';
var labelClassName = 'label';
if (this._ratio) {
var ratioType = this._ratio > 0 ? 'better' : 'worse';
barClassName = [barClassName, ratioType].join(' ');
labelClassName = [labelClassName, ratioType].join(' ');
children.push(element('div', {class: barClassName, style: 'width:' + Math.min(Math.abs(this._ratio * 100), 50) + '%'}));
}
if (this._label)
children.push(element('div', {class: labelClassName}, this._label));
this.renderReplace(this._ratioBarGraph, children);
}
static htmlTemplate()
{
return `<div class="ratio-bar-graph"></div>`;
}
static cssTemplate()
{
return `
.ratio-bar-graph {
position: relative;
display: block;
margin-left: auto;
margin-right: auto;
width: 10rem;
height: 2.5rem;
overflow: hidden;
text-decoration: none;
color: black;
}
.ratio-bar-graph warning-icon {
position: absolute;
display: block;
top: 0;
}
.ratio-bar-graph:not(.warning-on-right) warning-icon {
left: 0;
}
.ratio-bar-graph.warning-on-right warning-icon {
transform: scaleX(-1);
right: 0;
}
.ratio-bar-graph .separator {
position: absolute;
left: 50%;
width: 0px;
height: 100%;
border-left: solid 1px #ccc;
}
.ratio-bar-graph .bar {
position: absolute;
left: 50%;
top: 0.5rem;
height: calc(100% - 1rem);
background: #ccc;
}
.ratio-bar-graph .bar.worse {
transform: translateX(-100%);
background: #c33;
}
.ratio-bar-graph .bar.better {
background: #3c3;
}
.ratio-bar-graph .label {
position: absolute;
line-height: 2.5rem;
}
.ratio-bar-graph .label.worse {
text-align: left;
left: calc(50% + 0.2rem);
}
.ratio-bar-graph .label.better {
text-align: right;
right: calc(50% + 0.2rem);
}
`;
}
}