generic-poky/bitbake/lib/toaster/toastergui/static/js/mrbsection.js

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();
}