blob: 6737b65933d034cb5c257ca9fc9ac6b5ac63be1e [file] [log] [blame] [edit]
/*jslint vars: true, browser: true, devel: true, plusplus: true, unparam: true*/
/*global $, jQuery, alert, db_name, test_suite_name */
var STATE_NAMES = {0: 'Detected',
1: 'Staged',
10: 'Active',
20: 'Not to be Fixed',
21: 'Ignored',
23: 'Verify',
22: 'Fixed'};
var regression_cache = [];
var lnt_graph = {};
// Grab the graph API url for this line.
function get_api_url(kind, db, ts, mtf) {
"use strict";
return [lnt_url_base, "api", "db_" + db, "v4", ts, kind, mtf].join('/');
}
// Grab the URL for a machine by id.
function get_machine_url(db, ts, machineID) {
"use strict";
return [lnt_url_base, "db_" + db, "v4", ts, "machine", machineID].join('/');
}
// Grab the URL for a order by id.
function get_order_url(db, ts, orderID) {
"use strict";
return [lnt_url_base, "db_" + db, "v4", ts, "order", orderID].join('/');
}
// Grab the URL for a run by id.
function get_run_url(db, ts, runID) {
"use strict";
return [lnt_url_base, "db_" + db, "v4", ts, runID].join('/');
}
// Grab the URL for a regression by id.
function get_regression_url(db, ts, regression) {
"use strict";
return [lnt_url_base, "db_" + db, "v4", ts, "regressions", regression].join('/');
}
// Create a new regression manually URL.
function get_manual_regression_url(db, ts, url, runID) {
"use strict";
return [lnt_url_base, "db_" + db, "v4", ts, "regressions/new_from_graph", url, runID].join('/');
}
// Show our overlay tooltip.
lnt_graph.current_tip_point = null;
function plotly_show_tooltip(data) {
"use strict";
var tip_body = '<div id="tooltip">';
var point = data.points[0];
if (point.data.regression && point.data.regressionID) {
tip_body += "<b><a href=\"" +
get_regression_url(db_name, test_suite_name, point.data.regressionID) +
"\">" + point.data.regression + "</a></b></br>";
}
if (point.data.machine && point.data.machineID) {
tip_body += "<b>Machine:</b> <a href=\"" +
get_machine_url(db_name, test_suite_name, point.data.machineID) +
"\">" + point.data.machine + "</a><br>";
}
if (point.data.test_name) {
tip_body += "<b>Test:</b> " + point.data.test_name + "<br>";
}
if (point.data.metric) {
tip_body += "<b>Metric:</b> " + point.data.metric + "<br>";
}
if (point.meta.order) {
if (point.meta.orderID) {
tip_body += "<b>Order:</b> <a href=\"" +
get_order_url(db_name, test_suite_name, point.meta.orderID) +
"\">" + point.meta.order + "</a><br>";
} else {
tip_body += "<b>Order:</b> " + point.meta.order + "<br>";
}
}
tip_body += "<b>Value:</b> " + point.y.toFixed(4) + "<br>";
if (point.meta.date) {
tip_body += "<b>Date:</b> " + point.meta.date + "<br>";
}
if (point.meta.state) {
tip_body += "<b>State:</b> " + point.meta.state + "<br>";
}
if (point.meta.runID) {
tip_body += "<b>Run:</b> <a href=\"" +
get_run_url(db_name, test_suite_name, point.meta.runID) +
"\">" + point.meta.runID + "</a><br>";
}
if (point.meta.runID && point.data.url) { // url = machine.id/test.id/field_index
tip_body += "<a href=\"" +
get_manual_regression_url(db_name, test_suite_name, point.data.url, point.meta.runID) +
"\">Mark Change.</a><br>";
}
tip_body += "</div>";
var tooltip_div = $(tip_body).css({
position: 'absolute',
display: 'none',
top: data.event.pageY + 5,
left: data.event.pageX + 5,
border: '1px solid #fdd',
padding: '2px',
'background-color': '#fee',
opacity: 0.80,
'z-index': 100000
}).appendTo("body").fadeIn(200);
// Now make sure the tool tip is on the graph canvas.
var tt_position = tooltip_div.position();
var graph_div = $("#graph");
var graph_position = graph_div.position();
// The right edge of the graph.
var max_width = graph_position.left + graph_div.width();
// The right edge of the tool tip.
var tt_right = tt_position.left + tooltip_div.width();
if (tt_right > max_width) {
var diff = tt_right - max_width;
var GRAPH_BORDER = 10;
var VISUAL_APPEAL = 10;
tooltip_div.css({'left' : tt_position.left - diff
- GRAPH_BORDER - VISUAL_APPEAL});
}
}
// Event handler function to update the tooltop.
function plotly_update_tooltip(data) {
"use strict";
if (!data || data.points.length == 0) {
$("#tooltip").fadeOut(200, function () {
$("#tooltip").remove();
});
lnt_graph.current_tip_point = null;
return;
}
if (!lnt_graph.current_tip_point || (lnt_graph.current_tip_point[0] !== data.points.curveNumber ||
lnt_graph.current_tip_point[1] !== data.points.pointNumber)) {
$("#tooltip").remove();
lnt_graph.current_tip_point = [data.points[0].curveNumber, data.points[0].pointNumber];
plotly_show_tooltip(data);
}
}
function plotly_hide_tooltip(data) {
"use strict";
plotly_update_tooltip(null);
}
function get_regression_id() {
"use strict";
var path = window.location.pathname.split("/");
if (path[path.length - 2] === "regressions") {
return parseInt(path[path.length - 1], 10);
}
}
function plotly_graph_regression_callback(data, index, item, yaxis, update_func) {
"use strict";
$.each(data, function (i, r) {
if (get_regression_id() !== null) {
if (get_regression_id() === r.id || r.state === 21) {
return;
}
}
if (!(regression_cache[index])) {
regression_cache[index] = [];
}
regression_cache[index].push({
"x": [r.end_point[0]],
"y": [r.end_point[1]],
"meta": [{
"order": r.end_point[0],
"state": STATE_NAMES[r.state]
}],
"name": r.title,
"machine": item[0].name,
"machineID": item[0].id,
"metric": item[2],
"yaxis": yaxis,
"regression": r.title,
"regressionID": r.id,
"legendgroup": "regressions",
"showlegend": true,
"mode": "markers",
"marker": {
"color": "red",
"symbol": "triangle-up-open",
"size": 13}
});
});
update_func();
}
/* On the normal graph page, data is loaded during page load.
This function takes the plots from page load and adds the regressions
that are asynchrounusly fetched.
*/
function plotly_update_graphplots(old_plot) {
"use strict";
// Regressions.
var new_plot = $.extend([], old_plot);
for (var i = 0; i < regression_cache.length; i++) {
if (regression_cache[i]) {
regression_cache[i].forEach(function(j){
new_plot.push(j);
});
}
}
return new_plot;
}