151 lines
4.8 KiB
JavaScript
151 lines
4.8 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", "Failed"
|
||
|
// or "Cancelled" 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 tasks_complete_percentage changed
|
||
|
function tasksProgressChanged(build) {
|
||
|
var cached = getCached(build);
|
||
|
return (cached.tasks_complete_percentage !== build.tasks_complete_percentage);
|
||
|
}
|
||
|
|
||
|
// returns true if the number of recipes parsed/to parse changed
|
||
|
function recipeProgressChanged(build) {
|
||
|
var cached = getCached(build);
|
||
|
return (cached.recipes_parsed_percentage !== build.recipes_parsed_percentage);
|
||
|
}
|
||
|
|
||
|
// returns true if the number of repos cloned/to clone changed
|
||
|
function cloneProgressChanged(build) {
|
||
|
var cached = getCached(build);
|
||
|
return (cached.repos_cloned_percentage !== build.repos_cloned_percentage);
|
||
|
}
|
||
|
|
||
|
function refreshMostRecentBuilds(){
|
||
|
libtoaster.getMostRecentBuilds(
|
||
|
libtoaster.ctx.mostRecentBuildsUrl,
|
||
|
|
||
|
// success callback
|
||
|
function (data) {
|
||
|
var build;
|
||
|
var tmpl;
|
||
|
var container;
|
||
|
var selector;
|
||
|
var colourClass;
|
||
|
var elements;
|
||
|
|
||
|
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
|
||
|
build.warnings_pluralise = (build.warnings !== 1 ? 's' : '');
|
||
|
build.errors_pluralise = (build.errors !== 1 ? 's' : '');
|
||
|
|
||
|
tmpl = $.templates("#build-template");
|
||
|
|
||
|
html = $(tmpl.render(build));
|
||
|
|
||
|
selector = '[data-latest-build-result="' + build.id + '"] ' +
|
||
|
'[data-role="build-status-container"]';
|
||
|
container = $(selector);
|
||
|
|
||
|
// initialize bootstrap tooltips in the new HTML
|
||
|
html.find('span.glyphicon-question-sign').tooltip();
|
||
|
|
||
|
container.html(html);
|
||
|
}
|
||
|
else if (cloneProgressChanged(build)) {
|
||
|
// update the clone progress text
|
||
|
selector = '#repos-cloned-percentage-' + build.id;
|
||
|
$(selector).html(build.repos_cloned_percentage);
|
||
|
|
||
|
// update the recipe progress bar
|
||
|
selector = '#repos-cloned-percentage-bar-' + build.id;
|
||
|
$(selector).width(build.repos_cloned_percentage + '%');
|
||
|
}
|
||
|
else if (tasksProgressChanged(build)) {
|
||
|
// update the task progress text
|
||
|
selector = '#build-pc-done-' + build.id;
|
||
|
$(selector).html(build.tasks_complete_percentage);
|
||
|
|
||
|
// update the task progress bar
|
||
|
selector = '#build-pc-done-bar-' + build.id;
|
||
|
$(selector).width(build.tasks_complete_percentage + '%');
|
||
|
}
|
||
|
else if (recipeProgressChanged(build)) {
|
||
|
// update the recipe progress text
|
||
|
selector = '#recipes-parsed-percentage-' + build.id;
|
||
|
$(selector).html(build.recipes_parsed_percentage);
|
||
|
|
||
|
// update the recipe progress bar
|
||
|
selector = '#recipes-parsed-percentage-bar-' + build.id;
|
||
|
$(selector).width(build.recipes_parsed_percentage + '%');
|
||
|
}
|
||
|
|
||
|
buildData[build.id] = build;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// fail callback
|
||
|
function (data) {
|
||
|
console.error(data);
|
||
|
}
|
||
|
);
|
||
|
}
|
||
|
|
||
|
window.setInterval(refreshMostRecentBuilds, 1500);
|
||
|
refreshMostRecentBuilds();
|
||
|
}
|