134 lines
4.0 KiB
JavaScript
134 lines
4.0 KiB
JavaScript
|
|
function mrbSectionInit(ctx){
|
|
$('#latest-builds').on('click', '.cancel-build-btn', function(e){
|
|
e.stopImmediatePropagation();
|
|
e.preventDefault();
|
|
|
|
var url = $(this).data('request-url');
|
|
var buildReqIds = $(this).data('buildrequest-id');
|
|
|
|
libtoaster.cancelABuild(url, buildReqIds, function () {
|
|
window.location.reload();
|
|
}, null);
|
|
});
|
|
|
|
$('#latest-builds').on('click', '.rebuild-btn', function(e){
|
|
e.stopImmediatePropagation();
|
|
e.preventDefault();
|
|
|
|
var url = $(this).data('request-url');
|
|
var target = $(this).data('target');
|
|
|
|
libtoaster.startABuild(url, target, function(){
|
|
window.location.reload();
|
|
}, null);
|
|
});
|
|
|
|
// cached version of buildData, so we can determine whether a build has
|
|
// changed since it was last fetched, and update the DOM appropriately
|
|
var buildData = {};
|
|
|
|
// returns the cached version of this build, or {} is there isn't a cached one
|
|
function getCached(build) {
|
|
return buildData[build.id] || {};
|
|
}
|
|
|
|
// returns true if a build's state changed to "Succeeded" or "Failed"
|
|
// from some other value
|
|
function buildFinished(build) {
|
|
var cached = getCached(build);
|
|
return cached.state &&
|
|
cached.state !== build.state &&
|
|
(build.state == 'Succeeded' || build.state == 'Failed' ||
|
|
build.state == 'Cancelled');
|
|
}
|
|
|
|
// returns true if the state changed
|
|
function stateChanged(build) {
|
|
var cached = getCached(build);
|
|
return (cached.state !== build.state);
|
|
}
|
|
|
|
// returns true if the complete_percentage changed
|
|
function progressChanged(build) {
|
|
var cached = getCached(build);
|
|
return (cached.tasks_complete_percentage !== build.tasks_complete_percentage);
|
|
}
|
|
|
|
function refreshMostRecentBuilds(){
|
|
libtoaster.getMostRecentBuilds(
|
|
libtoaster.ctx.mostRecentBuildsUrl,
|
|
|
|
// success callback
|
|
function (data) {
|
|
var build;
|
|
var tmpl;
|
|
var container;
|
|
var selector;
|
|
var colourClass;
|
|
var elements;
|
|
|
|
// classes on the parent which signify the build state and affect
|
|
// the colour of the container for the build
|
|
var buildStateClasses = 'alert-info alert-success alert-danger';
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
build = data[i];
|
|
|
|
if (buildFinished(build)) {
|
|
// a build finished: reload the whole page so that the build
|
|
// shows up in the builds table
|
|
window.location.reload();
|
|
}
|
|
else if (stateChanged(build)) {
|
|
// update the whole template
|
|
tmpl = $.templates("#build-template");
|
|
|
|
html = tmpl.render(build);
|
|
|
|
selector = '[data-latest-build-result="' + build.id + '"] ' +
|
|
'[data-role="build-status-container"]';
|
|
container = $(selector);
|
|
|
|
container.html(html);
|
|
|
|
// style the outermost container for this build to reflect
|
|
// the new build state (red, green, blue);
|
|
// NB class set here should be in buildStateClasses
|
|
colourClass = 'alert-info';
|
|
if (build.state == 'Succeeded') {
|
|
colourClass = 'alert-success';
|
|
}
|
|
else if (build.state == 'Failed') {
|
|
colourClass = 'alert-danger';
|
|
}
|
|
|
|
elements = $('[data-latest-build-result="' + build.id + '"]');
|
|
elements.removeClass(buildStateClasses);
|
|
elements.addClass(colourClass);
|
|
}
|
|
else if (progressChanged(build)) {
|
|
// update the progress text
|
|
selector = '#build-pc-done-' + build.id;
|
|
$(selector).html(build.tasks_complete_percentage);
|
|
|
|
// update the progress bar
|
|
selector = '#build-pc-done-bar-' + build.id;
|
|
$(selector).width(build.tasks_complete_percentage + '%');
|
|
}
|
|
|
|
buildData[build.id] = build;
|
|
}
|
|
},
|
|
|
|
// fail callback
|
|
function (data) {
|
|
console.error(data);
|
|
}
|
|
);
|
|
}
|
|
|
|
window.setInterval(refreshMostRecentBuilds, 1000);
|
|
refreshMostRecentBuilds();
|
|
}
|