* hydra: make chart zoomable and clickable
[?]
Feb 11, 2010, 9:18 AM
TCXFZZFNJAO6UBBRHJLBXHDPCCKTXIPVFJ3YCDIBS4W7ZJTAI4NACDependencies
- [2]
2R7GHSA4* hydra: added initial version of build graph - [3]
J5UVLXOK* Start of a basic Catalyst web interface. - [4]
NZI7E2E3* hydra: handle case where logfile is empty - [5]
WHAFVCEI - [6]
ZI535LI6* hydra: 'new' UI for project/jobset/job/build - [7]
VCOSLZRP - [*]
LBNVQXUB* Build the /build stuff in a separate controller. - [*]
A52HEFHQ* Allow builds to be restarted (if they failed with a transient error,
Change contents
- replacement in src/lib/Hydra/Controller/Build.pm at line 62
, { order_by => "id DESC", rows => 20 }, { order_by => "id DESC", rows => 100 } - edit in src/root/build.tt at line 83[10.1696][3.7438]
- edit in src/root/build.tt at line 420
<h2>Build time history (in seconds)</h2><div id="placeholder" style="width:800px;height:400px;"></div><div id="overview" style="margin-left:50px;margin-top:20px;width:600px;height:50px"></div> - edit in src/root/build.tt at line 424
<div id="placeholder" style="width:600px;height:300px;"></div> - edit in src/root/build.tt at line 425
<script src="/static/js/flot/jquery.flot.selection.js" type="text/javascript"></script> - replacement in src/root/build.tt at line 428
var d = [ null [% FOREACH prevbuild IN prevBuilds %][% IF prevbuild.resultInfo.starttime != 0 && (prevbuild.resultInfo.stoptime - prevbuild.resultInfo.starttime) != 0 %],[[% prevbuild.resultInfo.starttime * 1000 %],[% prevbuild.resultInfo.stoptime - prevbuild.resultInfo.starttime %]] [% END %] [% END %] ] ;var d = [];var ids = [];[% FOREACH prevbuild IN prevBuilds %][% IF prevbuild.resultInfo.starttime != 0 %]d.push([[% prevbuild.resultInfo.starttime * 1000 %],[% prevbuild.resultInfo.stoptime - prevbuild.resultInfo.starttime %]]);ids[[% prevbuild.resultInfo.starttime * 1000 %]] = [% prevbuild.id %] ;[% END %][% END %] - edit in src/root/build.tt at line 435
// helper for returning the weekends in a periodfunction weekendAreas(axes) {var markings = [];var d = new Date(axes.xaxis.min);// go to the first Saturdayd.setUTCDate(d.getUTCDate() - ((d.getUTCDay() + 1) % 7))d.setUTCSeconds(0);d.setUTCMinutes(0);d.setUTCHours(0);var i = d.getTime();do {// when we don't set yaxis, the rectangle automatically// extends to infinity upwards and downwardsmarkings.push({ xaxis: { from: i, to: i + 2 * 24 * 60 * 60 * 1000 } });i += 7 * 24 * 60 * 60 * 1000;} while (i < axes.xaxis.max);return markings;}var now = (new Date()).getTime() ;var minimum = now;for (var i = 1; i < d.length; ++i)if ( minimum > d[i][0] )minimum = d[i][0] ;var now = (new Date()).getTime() ; - replacement in src/root/build.tt at line 436
xaxis: { mode: "time", min: minimum, max: now,},xaxis: { mode: "time" },selection: { mode: "x" }, - replacement in src/root/build.tt at line 440
selection: { mode: "x" },grid: { markings: weekendAreas }grid: {clickable: true,hoverable: true,hoverFill: '#444',hoverRadius: 4,}, - edit in src/root/build.tt at line 447
- replacement in src/root/build.tt at line 450
if (ui.panel.id == "tabs-history") {$.plot($("#placeholder"), [{ data: d,clickable : true,hoverable : true,},], options );}})if (ui.panel.id == "tabs-history") {var plot = $.plot($("#placeholder"), [d], options);var overview = $.plot($("#overview"), [d], {series: {lines: { show: true, lineWidth: 1 },shadowSize: 0},xaxis: { ticks: [], mode: "time" },yaxis: { ticks: [], min: 0, autoscaleMargin: 0.1 },selection: { mode: "x" }});// now connect the two$("#placeholder").bind("plotselected", function (event, ranges) {// do the zoomingplot = $.plot($("#placeholder"), [d],$.extend(true, {}, options, {xaxis: { min: ranges.xaxis.from, max: ranges.xaxis.to }}));// don't fire event on the overview to prevent eternal loopoverview.setSelection(ranges, true);});$("#overview").bind("plotselected", function (event, ranges) {plot.setSelection(ranges);});$("#placeholder").bind("plotclick", function (e, pos, item) {if (item) {plot.highlight(item.series, item.datapoint);buildid = ids[item.datapoint[0]];window.location = "/build/"+buildid;}});}});