1*4882a593Smuzhiyun 2*4882a593Smuzhiyunfunction mrbSectionInit(ctx){ 3*4882a593Smuzhiyun $('#latest-builds').on('click', '.cancel-build-btn', function(e){ 4*4882a593Smuzhiyun e.stopImmediatePropagation(); 5*4882a593Smuzhiyun e.preventDefault(); 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun var url = $(this).data('request-url'); 8*4882a593Smuzhiyun var buildReqIds = $(this).data('buildrequest-id'); 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun libtoaster.cancelABuild(url, buildReqIds, function () { 11*4882a593Smuzhiyun window.location.reload(); 12*4882a593Smuzhiyun }, null); 13*4882a593Smuzhiyun }); 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun $('#latest-builds').on('click', '.rebuild-btn', function(e){ 16*4882a593Smuzhiyun e.stopImmediatePropagation(); 17*4882a593Smuzhiyun e.preventDefault(); 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun var url = $(this).data('request-url'); 20*4882a593Smuzhiyun var target = $(this).data('target'); 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun libtoaster.startABuild(url, target, function(){ 23*4882a593Smuzhiyun window.location.reload(); 24*4882a593Smuzhiyun }, null); 25*4882a593Smuzhiyun }); 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun // cached version of buildData, so we can determine whether a build has 28*4882a593Smuzhiyun // changed since it was last fetched, and update the DOM appropriately 29*4882a593Smuzhiyun var buildData = {}; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun // returns the cached version of this build, or {} is there isn't a cached one 32*4882a593Smuzhiyun function getCached(build) { 33*4882a593Smuzhiyun return buildData[build.id] || {}; 34*4882a593Smuzhiyun } 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun // returns true if a build's state changed to "Succeeded", "Failed" 37*4882a593Smuzhiyun // or "Cancelled" from some other value 38*4882a593Smuzhiyun function buildFinished(build) { 39*4882a593Smuzhiyun var cached = getCached(build); 40*4882a593Smuzhiyun return cached.state && 41*4882a593Smuzhiyun cached.state !== build.state && 42*4882a593Smuzhiyun (build.state == 'Succeeded' || build.state == 'Failed' || 43*4882a593Smuzhiyun build.state == 'Cancelled'); 44*4882a593Smuzhiyun } 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun // returns true if the state changed 47*4882a593Smuzhiyun function stateChanged(build) { 48*4882a593Smuzhiyun var cached = getCached(build); 49*4882a593Smuzhiyun return (cached.state !== build.state); 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun // returns true if the tasks_complete_percentage changed 53*4882a593Smuzhiyun function tasksProgressChanged(build) { 54*4882a593Smuzhiyun var cached = getCached(build); 55*4882a593Smuzhiyun return (cached.tasks_complete_percentage !== build.tasks_complete_percentage); 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun // returns true if the number of recipes parsed/to parse changed 59*4882a593Smuzhiyun function recipeProgressChanged(build) { 60*4882a593Smuzhiyun var cached = getCached(build); 61*4882a593Smuzhiyun return (cached.recipes_parsed_percentage !== build.recipes_parsed_percentage); 62*4882a593Smuzhiyun } 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun // returns true if the number of repos cloned/to clone changed 65*4882a593Smuzhiyun function cloneProgressChanged(build) { 66*4882a593Smuzhiyun var cached = getCached(build); 67*4882a593Smuzhiyun return (cached.repos_cloned_percentage !== build.repos_cloned_percentage); 68*4882a593Smuzhiyun } 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun function refreshMostRecentBuilds(){ 71*4882a593Smuzhiyun libtoaster.getMostRecentBuilds( 72*4882a593Smuzhiyun libtoaster.ctx.mostRecentBuildsUrl, 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun // success callback 75*4882a593Smuzhiyun function (data) { 76*4882a593Smuzhiyun var build; 77*4882a593Smuzhiyun var tmpl; 78*4882a593Smuzhiyun var container; 79*4882a593Smuzhiyun var selector; 80*4882a593Smuzhiyun var colourClass; 81*4882a593Smuzhiyun var elements; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun for (var i = 0; i < data.length; i++) { 84*4882a593Smuzhiyun build = data[i]; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun if (buildFinished(build)) { 87*4882a593Smuzhiyun // a build finished: reload the whole page so that the build 88*4882a593Smuzhiyun // shows up in the builds table 89*4882a593Smuzhiyun window.location.reload(true); 90*4882a593Smuzhiyun } 91*4882a593Smuzhiyun else if (stateChanged(build)) { 92*4882a593Smuzhiyun // update the whole template 93*4882a593Smuzhiyun build.warnings_pluralise = (build.warnings !== 1 ? 's' : ''); 94*4882a593Smuzhiyun build.errors_pluralise = (build.errors !== 1 ? 's' : ''); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun tmpl = $.templates("#build-template"); 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun html = $(tmpl.render(build)); 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun selector = '[data-latest-build-result="' + build.id + '"] ' + 101*4882a593Smuzhiyun '[data-role="build-status-container"]'; 102*4882a593Smuzhiyun container = $(selector); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun // initialize bootstrap tooltips in the new HTML 105*4882a593Smuzhiyun html.find('span.glyphicon-question-sign').tooltip(); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun container.html(html); 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun else if (cloneProgressChanged(build)) { 110*4882a593Smuzhiyun // update the clone progress text 111*4882a593Smuzhiyun selector = '#repos-cloned-percentage-' + build.id; 112*4882a593Smuzhiyun $(selector).html(build.repos_cloned_percentage); 113*4882a593Smuzhiyun selector = '#repos-cloned-progressitem-' + build.id; 114*4882a593Smuzhiyun $(selector).html('('+build.progress_item+')'); 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun // update the recipe progress bar 117*4882a593Smuzhiyun selector = '#repos-cloned-percentage-bar-' + build.id; 118*4882a593Smuzhiyun $(selector).width(build.repos_cloned_percentage + '%'); 119*4882a593Smuzhiyun } 120*4882a593Smuzhiyun else if (tasksProgressChanged(build)) { 121*4882a593Smuzhiyun // update the task progress text 122*4882a593Smuzhiyun selector = '#build-pc-done-' + build.id; 123*4882a593Smuzhiyun $(selector).html(build.tasks_complete_percentage); 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun // update the task progress bar 126*4882a593Smuzhiyun selector = '#build-pc-done-bar-' + build.id; 127*4882a593Smuzhiyun $(selector).width(build.tasks_complete_percentage + '%'); 128*4882a593Smuzhiyun } 129*4882a593Smuzhiyun else if (recipeProgressChanged(build)) { 130*4882a593Smuzhiyun // update the recipe progress text 131*4882a593Smuzhiyun selector = '#recipes-parsed-percentage-' + build.id; 132*4882a593Smuzhiyun $(selector).html(build.recipes_parsed_percentage); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun // update the recipe progress bar 135*4882a593Smuzhiyun selector = '#recipes-parsed-percentage-bar-' + build.id; 136*4882a593Smuzhiyun $(selector).width(build.recipes_parsed_percentage + '%'); 137*4882a593Smuzhiyun } 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun buildData[build.id] = build; 140*4882a593Smuzhiyun } 141*4882a593Smuzhiyun }, 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun // fail callback 144*4882a593Smuzhiyun function (data) { 145*4882a593Smuzhiyun console.error(data); 146*4882a593Smuzhiyun } 147*4882a593Smuzhiyun ); 148*4882a593Smuzhiyun } 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun window.setInterval(refreshMostRecentBuilds, 1500); 151*4882a593Smuzhiyun refreshMostRecentBuilds(); 152*4882a593Smuzhiyun} 153