blob: 96d5facb903f731be4585ac4bab11dd9a65857e5 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright 2016 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<!--
The chart-tooltip element is the box that is shown when you hover over or click
on a point on a graph. It shows more detailed information about the point that
was just clicked.
-->
<link rel="import" href="/components/paper-dialog/paper-action-dialog.html">
<link rel="import" href="/dashboard/elements/alert-remove-box.html">
<link rel="import" href="/dashboard/elements/bisect-button.html">
<link rel="import" href="/dashboard/elements/trace-button.html">
<link rel="import" href="/dashboard/elements/triage-dialog.html">
<polymer-element
name="chart-tooltip"
attributes="testPath value bugId pointId revisions links alerts xsrfToken">
<template>
<style>
#container {
position: absolute;
margin: 20px;
}
#tooltip {
position: relative;
margin: 0px;
padding: 0px;
}
</style>
<div id="container">
<triage-dialog id="triage"
xsrfToken="{{xsrfToken}}"
alerts="{{alerts}}"></triage-dialog>
<paper-action-dialog id="tooltip" layered="false" autoCloseDisabled="true">
<style>
#test-name {
width : 300px;
word-wrap: break-word;
}
div:not(:last-of-type) {
margin-bottom: 15px;
}
</style>
<!-- TODO(qyearsley): Either (1) Display alert details on mouse-over as
well as click (The alerts attribute is only set currently on click,
not on hover) OR (2) Display alert details in the triage dialog. -->
<template bind repeat="{{alerts}}">
<div class="important">
<b>Alert information:</b><br>
Median of segment before: {{median_before_anomaly}}<br>
Median of segment after: {{median_after_anomaly}}<br>
Relative change: {{percent_changed}}<br>
</div>
</template>
<div id="test-name">
Test: {{parentPath}}/<b>{{seriesName}}</b>
</div>
<div>
Value: <b>{{value}}</b> <span hidden?={{!stddev}}>(± {{stddev}})</span>
</div>
<div>
<span hidden?={{!pointId}}>Point ID: {{pointId}}</span><br>
<span hidden?={{!timestamp}}>Time added: {{timestamp}}</span>
</div>
<template bind if="{{bugId}}">
<div>
<span hidden?={{alertInvalidOrIgnored}}>Bug ID:
<b><a target="_blank" href="http://crbug.com/{{bugId}}">{{bugId}}</a></b>
</span>
<span hidden?="{{bugId != -1}}">Invalid alert</span>
<span hidden?="{{bugId != -2}}">Ignored alert</span>
<span hidden?="{{!recovered}}">Recovered alert</span>
<alert-remove-box key="{{alertKey}}" xsrfToken="{{xsrfToken}}" on-untriaged="{{onUntriaged}}">
</alert-remove-box><br>
<a href="/group_report?keys={{alertKey}}">View alert graph</a>
</div>
</template>
<div>
<template repeat={{revisions}}>
{{name}}<template bind if="{{start}}"> range</template>:
<b>
<a href="{{url}}" on-click="{{onRevisionRangeClick}}">
<template bind if="{{start}}">{{displayStart}} - </template>
{{displayEnd}}
</a>
</b><br>
</template>
</div>
<div>
<template repeat={{links}}>
<span class="annotation-link"><a href="{{url}}" target="_blank">{{text}}</a></span><br />
</template>
</div>
<bisect-button affirmative xsrfToken="{{xsrfToken}}"
bugId="{{bugId}}"
bisectInfo="{{bisectInfo}}"></bisect-button>
<trace-button affirmative xsrfToken="{{xsrfToken}}"
bugId="{{bugId}}"
traceInfo="{{bisectInfo}}"></trace-button>
</paper-action-dialog>
</div>
</template>
<script>
'use strict';
Polymer('chart-tooltip', {
traceName: null,
value: null,
stddev: null,
hideStddev: true,
bugId: null,
stdioUri: null,
hideStdioUri: true,
revisions: [],
ready: function() {
// This allows tooltip to show beyond the current window size.
// Our tooltip size is determined by 'sizingTarget' which is default to
// the window size. Here we set it to '#scroller' which is the
// content's container.
// 'core-overlay' API:
// https://github.com/Polymer/core-overlay/blob/master/core-overlay.html
//
// Note: Though this deep shadow DOM selector was deprecated, it was
// a solution in Polymer 0.5 to customize elements. This can be done
// using custom CSS properties when migrating to Polymer 1.0.
this.$.tooltip.sizingTarget = document.querySelector(
'html /deep/ paper-action-dialog::shadow #scroller');
// We're going to call 'open' tooltip and hide it's container on
// 'ready' to avoid 'core-overlay' initial element focus which causes
// the page to jump.
// TODO(chrisphan): Figure out a better way to do this.
this.$.container.hidden = true;
this.$.tooltip.open();
},
testPathChanged: function() {
if (this.testPath) {
var parts = this.testPath.split('/');
this.seriesName = parts.pop();
this.parentPath = parts.join('/');
}
},
/**
* Shows the CL descriptions for the given revision range.
*/
onRevisionRangeClick: function(event, detail, sender) {
window.open(sender.href, 'changelog', 'width=1000,height=1000');
event.preventDefault();
},
/**
* Updates the display of the triage-dialog.
* This method is called whenever the value of this.alerts changes,
* e.g. by chart-container when an alert is triaged.
*/
alertsChanged: function() {
// The triage-dialog should be shown when there is some non-triaged
// alert, and hidden otherwise.
if (this.alerts && this.alerts.length) {
this.$.triage.show();
} else {
this.$.triage.close();
}
},
/**
* Fires a 'triaged' event, which should be caught in chart-container.
*/
onUntriaged: function(event, detail, sender) {
this.fire('triaged', {
'alerts': this.triagedAlerts,
'bugid': null
});
},
open: function() {
if (this.closeTooltipJob) {
this.closeTooltipJob.stop();
}
this.$.tooltip.open();
this.$.container.hidden = false;
},
close: function() {
// Add a short delay before closing as a workaround for a bug in
// core-overlay where core-overlay is opened and closed too frequent.
// See: https://github.com/dart-lang/paper-elements/issues/83"
this.closeTooltipJob = this.job(
this.closeTooltipJob,
function() {
this.$.container.hidden = true;
},
200);
},
setPosition: function(top, left) {
this.$.container.style.top = top + 'px';
this.$.container.style.left = left + 'px';
}
});
</script>
</polymer-element>