blob: 5b4a6ad2aa9fe202f43b878f57ce889533f6aecd [file] [log] [blame]
class ChartPaneStatusView extends ComponentBase {
constructor(metric, chart)
{
super('chart-pane-status-view');
this._chart = chart;
this._status = new ChartStatusEvaluator(chart, metric);
this._revisionRange = new ChartRevisionRange(chart);
this._currentRepository = null;
this._renderStatusLazily = new LazilyEvaluatedFunction(this._renderStatus.bind(this));
this._renderBuildRevisionTableLazily = new LazilyEvaluatedFunction(this._renderBuildRevisionTable.bind(this));
}
render()
{
super.render();
this._renderStatusLazily.evaluate(this._status.status());
const indicator = this._chart.currentIndicator();
const build = indicator ? indicator.point.build() : null;
this._renderBuildRevisionTableLazily.evaluate(build, this._currentRepository, this._revisionRange.revisionList());
}
_renderStatus(status)
{
status = status || {};
let currentValue = status.currentValue || '';
if (currentValue)
currentValue += ` (${status.valueDelta} / ${status.relativeDelta})`;
this.content('current-value').textContent = currentValue;
this.content('comparison').textContent = status.label || '';
this.content('comparison').className = status.comparison || '';
}
_renderBuildRevisionTable(build, currentRepository, revisionList)
{
const element = ComponentBase.createElement;
const link = ComponentBase.createLink;
let tableContent = [];
if (build) {
const url = build.url();
const buildTag = build.buildTag();
tableContent.push(element('tr', [
element('td', 'Build'),
element('td', {colspan: 2}, [
url ? link(buildTag, build.label(), url, true) : buildTag,
` (${Metric.formatTime(build.buildTime())})`
]),
]));
}
if (revisionList) {
for (let info of revisionList) {
const selected = info.repository == this._currentRepository;
const action = () => {
this.dispatchAction('openRepository', this._currentRepository == info.repository ? null : info.repository);
};
tableContent.push(element('tr', {class: selected ? 'selected' : ''}, [
element('td', info.repository.name()),
element('td', info.url ? link(info.label, info.label, info.url, true) : info.label),
element('td', {class: 'commit-viewer-opener'}, link('\u00BB', action)),
]));
}
}
this.renderReplace(this.content('build-revision'), tableContent);
}
setCurrentRepository(repository)
{
this._currentRepository = repository;
this.enqueueToRender();
}
static htmlTemplate()
{
return `
<div id="chart-pane-status">
<h3 id="current-value"></h3>
<span id="comparison"></span>
</div>
<table id="build-revision"></table>
`;
}
static cssTemplate()
{
return Toolbar.cssTemplate() + `
#chart-pane-status {
display: block;
text-align: center;
}
#current-value,
#comparison {
display: block;
margin: 0;
padding: 0;
font-weight: normal;
font-size: 1rem;
}
#comparison.worse {
color: #c33;
}
#comparison.better {
color: #33c;
}
#build-revision {
line-height: 1rem;
font-size: 0.9rem;
font-weight: normal;
padding: 0;
margin: 0;
margin-top: 0.5rem;
border-bottom: solid 1px #ccc;
border-collapse: collapse;
width: 100%;
}
#build-revision th,
#build-revision td {
font-weight: inherit;
border-top: solid 1px #ccc;
padding: 0.2rem 0.2rem;
}
#build-revision .selected > th,
#build-revision .selected > td {
background: rgba(204, 153, 51, 0.1);
}
#build-revision .commit-viewer-opener {
width: 1rem;
}
#build-revision .commit-viewer-opener a {
text-decoration: none;
color: inherit;
font-weight: inherit;
}
`;
}
}