1*4882a593Smuzhiyun"use strict"; 2*4882a593Smuzhiyun 3*4882a593Smuzhiyunfunction customRecipePageInit(ctx) { 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun var urlParams = libtoaster.parseUrlParams(); 6*4882a593Smuzhiyun var customiseTable = $("#selectpackagestable"); 7*4882a593Smuzhiyun var addPkgDepsModalBtn = $("#add-package-deps-modal-btn"); 8*4882a593Smuzhiyun var rmdPkgReverseDepsModalBtn = $("#rm-package-reverse-deps-modal-btn"); 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new'){ 11*4882a593Smuzhiyun $("#image-created-notification").show(); 12*4882a593Smuzhiyun } 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun customiseTable.on('table-done', function(e, total){ 15*4882a593Smuzhiyun /* Table is done so now setup the click handler for the package buttons */ 16*4882a593Smuzhiyun $(".add-rm-package-btn").click(function(e){ 17*4882a593Smuzhiyun e.preventDefault(); 18*4882a593Smuzhiyun var targetPkg = $(this).data(); 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun checkPackageDeps(targetPkg, function(pkgData){ 21*4882a593Smuzhiyun if (targetPkg.directive === 'add'){ 22*4882a593Smuzhiyun /* If we're adding a package we may need to show the modal to advise 23*4882a593Smuzhiyun * on dependencies for this package. 24*4882a593Smuzhiyun */ 25*4882a593Smuzhiyun if (pkgData.unsatisfied_dependencies.length === 0){ 26*4882a593Smuzhiyun addRemovePackage(targetPkg); 27*4882a593Smuzhiyun } else { 28*4882a593Smuzhiyun showPackageDepsModal(targetPkg, pkgData); 29*4882a593Smuzhiyun } 30*4882a593Smuzhiyun } else if (targetPkg.directive === 'remove') { 31*4882a593Smuzhiyun if (pkgData.reverse_dependencies.length === 0){ 32*4882a593Smuzhiyun addRemovePackage(targetPkg); 33*4882a593Smuzhiyun } else { 34*4882a593Smuzhiyun showPackageReverseDepsModal(targetPkg, pkgData); 35*4882a593Smuzhiyun } 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun }); 38*4882a593Smuzhiyun }); 39*4882a593Smuzhiyun }); 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun function checkPackageDeps(targetPkg, doneCb){ 42*4882a593Smuzhiyun $.ajax({ 43*4882a593Smuzhiyun type: 'GET', 44*4882a593Smuzhiyun url: targetPkg.packageUrl, 45*4882a593Smuzhiyun headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, 46*4882a593Smuzhiyun success: function(data){ 47*4882a593Smuzhiyun if (data.error !== 'ok'){ 48*4882a593Smuzhiyun console.warn(data.error); 49*4882a593Smuzhiyun return; 50*4882a593Smuzhiyun } 51*4882a593Smuzhiyun doneCb(data); 52*4882a593Smuzhiyun } 53*4882a593Smuzhiyun }); 54*4882a593Smuzhiyun } 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun function showPackageDepsModal(targetPkg, pkgData){ 57*4882a593Smuzhiyun var modal = $("#package-deps-modal"); 58*4882a593Smuzhiyun var depsList = modal.find("#package-add-dep-list"); 59*4882a593Smuzhiyun var deps = pkgData.unsatisfied_dependencies; 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun modal.find(".package-to-add-name").text(targetPkg.name); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun depsList.text(""); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun for (var i in deps){ 66*4882a593Smuzhiyun var li = $('<li></li>').text(deps[i].name); 67*4882a593Smuzhiyun li.append($('<span></span>').text(" ("+ 68*4882a593Smuzhiyun deps[i].size_formatted+")")); 69*4882a593Smuzhiyun depsList.append(li); 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun modal.find("#package-deps-total-size").text( 73*4882a593Smuzhiyun pkgData.unsatisfied_dependencies_size_formatted); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun targetPkg.depsAdded = deps; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun addPkgDepsModalBtn.data(targetPkg); 78*4882a593Smuzhiyun modal.modal('show'); 79*4882a593Smuzhiyun } 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun addPkgDepsModalBtn.click(function(e){ 82*4882a593Smuzhiyun e.preventDefault(); 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun addRemovePackage($(this).data(), null); 85*4882a593Smuzhiyun }); 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun function showPackageReverseDepsModal(targetPkg, pkgData){ 88*4882a593Smuzhiyun var modal = $("#package-reverse-deps-modal"); 89*4882a593Smuzhiyun var depsList = modal.find("#package-reverse-dep-list"); 90*4882a593Smuzhiyun var deps = pkgData.reverse_dependencies; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun var depsCount = deps.length; 93*4882a593Smuzhiyun var vDepends = "depends"; 94*4882a593Smuzhiyun var vPackage = "package"; 95*4882a593Smuzhiyun var vThis = "this"; 96*4882a593Smuzhiyun if (depsCount > 1) { 97*4882a593Smuzhiyun vDepends = "depend"; 98*4882a593Smuzhiyun vPackage = "packages"; 99*4882a593Smuzhiyun vThis = "these"; 100*4882a593Smuzhiyun } 101*4882a593Smuzhiyun modal.find(".package-to-rm-name").text(targetPkg.name); 102*4882a593Smuzhiyun modal.find(".reverse-deps-count").text(depsCount); 103*4882a593Smuzhiyun modal.find(".reverse-deps-count-plus1").text((depsCount+1) + " packages"); 104*4882a593Smuzhiyun modal.find(".reverse-deps-depends").text(vDepends); 105*4882a593Smuzhiyun modal.find(".reverse-deps-package").text(vPackage); 106*4882a593Smuzhiyun modal.find(".reverse-deps-this").text(vThis); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun depsList.text(""); 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun for (var i in deps){ 111*4882a593Smuzhiyun var li = $('<li></li>').text(deps[i].name); 112*4882a593Smuzhiyun li.append($('<span></span>').text(" ("+ 113*4882a593Smuzhiyun deps[i].size_formatted+")")); 114*4882a593Smuzhiyun depsList.append(li); 115*4882a593Smuzhiyun } 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun modal.find("#package-reverse-deps-total-size").text( 118*4882a593Smuzhiyun pkgData.reverse_dependencies_size_formatted); 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun targetPkg.depsRemoved = deps; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun rmdPkgReverseDepsModalBtn.data(targetPkg); 123*4882a593Smuzhiyun modal.modal('show'); 124*4882a593Smuzhiyun } 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun rmdPkgReverseDepsModalBtn.click(function(e){ 127*4882a593Smuzhiyun e.preventDefault(); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun addRemovePackage($(this).data(), null); 130*4882a593Smuzhiyun }); 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun function addRemovePackage(targetPkg, tableParams){ 134*4882a593Smuzhiyun var method; 135*4882a593Smuzhiyun var msg = "You have "; 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun var btnCell = $("#package-btn-cell-" + targetPkg.id); 138*4882a593Smuzhiyun var inlineNotify = btnCell.children(".inline-notification"); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun var i; 141*4882a593Smuzhiyun var dep; 142*4882a593Smuzhiyun var depBtnCell; 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun if (targetPkg.directive === 'add') { 145*4882a593Smuzhiyun method = 'PUT'; 146*4882a593Smuzhiyun /* If the package had dependencies also notify that they were added */ 147*4882a593Smuzhiyun if (targetPkg.hasOwnProperty('depsAdded') && 148*4882a593Smuzhiyun targetPkg.depsAdded.length > 0) { 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun msg += "added "; 151*4882a593Smuzhiyun msg += "<strong>" + (targetPkg.depsAdded.length + 1) + "</strong>"; 152*4882a593Smuzhiyun msg += " packages to " + ctx.recipe.name + ": "; 153*4882a593Smuzhiyun msg += "<strong>" + targetPkg.name + "</strong> and its dependencies"; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun for (i in targetPkg.depsAdded){ 156*4882a593Smuzhiyun dep = targetPkg.depsAdded[i]; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun msg += " <strong>" + dep.name + "</strong>"; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun /* Add any cells currently in view to the list of cells which get 161*4882a593Smuzhiyun * an list-inline notification inside them and which change add/rm state 162*4882a593Smuzhiyun */ 163*4882a593Smuzhiyun depBtnCell = $("#package-btn-cell-" + dep.pk); 164*4882a593Smuzhiyun btnCell = btnCell.add(depBtnCell); 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun inlineNotify = inlineNotify.add( 167*4882a593Smuzhiyun depBtnCell.children(".inline-notification")); 168*4882a593Smuzhiyun } 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun inlineNotify.text( 171*4882a593Smuzhiyun (targetPkg.depsAdded.length + 1) + " packages added"); 172*4882a593Smuzhiyun 173*4882a593Smuzhiyun } else { 174*4882a593Smuzhiyun msg += "added <strong>1</strong>"; 175*4882a593Smuzhiyun msg += " package to " + ctx.recipe.name + ": "; 176*4882a593Smuzhiyun msg += "<strong>" + targetPkg.name + "</strong>"; 177*4882a593Smuzhiyun inlineNotify.text("1 package added"); 178*4882a593Smuzhiyun } 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun } else if (targetPkg.directive === 'remove') { 181*4882a593Smuzhiyun method = 'DELETE'; 182*4882a593Smuzhiyun var numPackageString = "1 package "; 183*4882a593Smuzhiyun var revDepList = ""; 184*4882a593Smuzhiyun if (targetPkg.hasOwnProperty('depsRemoved') && 185*4882a593Smuzhiyun targetPkg.depsRemoved.length > 0) { 186*4882a593Smuzhiyun var depsRemovedLength = targetPkg.depsRemoved.length; 187*4882a593Smuzhiyun var ending = "y: "; 188*4882a593Smuzhiyun var maxRevDepsDisplayed = 5; 189*4882a593Smuzhiyun var d = 0; 190*4882a593Smuzhiyun if (depsRemovedLength > 1) { 191*4882a593Smuzhiyun ending = "ies: "; 192*4882a593Smuzhiyun } 193*4882a593Smuzhiyun numPackageString = (depsRemovedLength + 1) + " packages"; 194*4882a593Smuzhiyun revDepList = " and its " + depsRemovedLength + " reverse dependenc" + ending; 195*4882a593Smuzhiyun for (i in targetPkg.depsRemoved){ 196*4882a593Smuzhiyun /* include up to maxRevDepsDisplayed rev deps on the page notification */ 197*4882a593Smuzhiyun var notShownCount = depsRemovedLength - maxRevDepsDisplayed; 198*4882a593Smuzhiyun dep = targetPkg.depsRemoved[i]; 199*4882a593Smuzhiyun if (d < maxRevDepsDisplayed) { 200*4882a593Smuzhiyun if (d > 0) { 201*4882a593Smuzhiyun revDepList += ", "; 202*4882a593Smuzhiyun } 203*4882a593Smuzhiyun revDepList += dep.name; 204*4882a593Smuzhiyun d++; 205*4882a593Smuzhiyun if ((d === maxRevDepsDisplayed) && (notShownCount > 0)) { 206*4882a593Smuzhiyun revDepList += " and " + notShownCount + " more"; 207*4882a593Smuzhiyun } 208*4882a593Smuzhiyun } 209*4882a593Smuzhiyun 210*4882a593Smuzhiyun /* Add any cells currently in view to the list of cells which get 211*4882a593Smuzhiyun * an list-inline notification inside them and which change add/rm state 212*4882a593Smuzhiyun */ 213*4882a593Smuzhiyun depBtnCell = $("#package-btn-cell-" + dep.pk); 214*4882a593Smuzhiyun btnCell = btnCell.add(depBtnCell); 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun inlineNotify = inlineNotify.add( 217*4882a593Smuzhiyun depBtnCell.children(".inline-notification")); 218*4882a593Smuzhiyun } 219*4882a593Smuzhiyun } 220*4882a593Smuzhiyun msg+= "removed " + numPackageString + " from " + ctx.recipe.name + ":"; 221*4882a593Smuzhiyun msg += " <strong>" + targetPkg.name + "</strong>"; 222*4882a593Smuzhiyun msg += revDepList; 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun inlineNotify.text(numPackageString + " removed"); 225*4882a593Smuzhiyun } else { 226*4882a593Smuzhiyun throw("Unknown package directive: should be add or remove"); 227*4882a593Smuzhiyun } 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun $.ajax({ 230*4882a593Smuzhiyun type: method, 231*4882a593Smuzhiyun url: targetPkg.packageUrl, 232*4882a593Smuzhiyun headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, 233*4882a593Smuzhiyun success: function(data){ 234*4882a593Smuzhiyun if (data.error !== 'ok'){ 235*4882a593Smuzhiyun console.warn(data.error); 236*4882a593Smuzhiyun return; 237*4882a593Smuzhiyun } 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun libtoaster.showChangeNotification(msg); 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun /* do the in-cell/inline notification to swap buttoms from add to 242*4882a593Smuzhiyun * remove 243*4882a593Smuzhiyun */ 244*4882a593Smuzhiyun btnCell.children("button").fadeOut().promise().done(function(){ 245*4882a593Smuzhiyun inlineNotify.fadeIn().delay(500).fadeOut(function(){ 246*4882a593Smuzhiyun if (targetPkg.directive === 'add') 247*4882a593Smuzhiyun btnCell.children("button[data-directive=remove]").fadeIn(); 248*4882a593Smuzhiyun else 249*4882a593Smuzhiyun btnCell.children("button[data-directive=add]").fadeIn(); 250*4882a593Smuzhiyun }); 251*4882a593Smuzhiyun }); 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* Update the total num packages */ 254*4882a593Smuzhiyun $.ajax({ 255*4882a593Smuzhiyun type: "GET", 256*4882a593Smuzhiyun url: ctx.recipe.xhrPackageListUrl, 257*4882a593Smuzhiyun headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, 258*4882a593Smuzhiyun success: function(data){ 259*4882a593Smuzhiyun console.log(data); 260*4882a593Smuzhiyun $("#total-num-packages").text(data.total); 261*4882a593Smuzhiyun $("#total-size-packages").text(data.total_size_formatted); 262*4882a593Smuzhiyun } 263*4882a593Smuzhiyun }); 264*4882a593Smuzhiyun } 265*4882a593Smuzhiyun }); 266*4882a593Smuzhiyun } 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun $("#no-results-show-all-packages").click(function(){ 269*4882a593Smuzhiyun $(".no-results-search-input").val(""); 270*4882a593Smuzhiyun }); 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun $("#no-results-remove-search-btn").click(function(){ 273*4882a593Smuzhiyun $(".no-results-search-input").val(""); 274*4882a593Smuzhiyun $(this).hide(); 275*4882a593Smuzhiyun }); 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun /* Trigger a build of your custom image */ 278*4882a593Smuzhiyun $(".build-custom-image").click(function(){ 279*4882a593Smuzhiyun libtoaster.startABuild(null, ctx.recipe.name, 280*4882a593Smuzhiyun function(){ 281*4882a593Smuzhiyun window.location.replace(libtoaster.ctx.projectBuildsUrl); 282*4882a593Smuzhiyun }); 283*4882a593Smuzhiyun }); 284*4882a593Smuzhiyun 285*4882a593Smuzhiyun $("#delete-custom-recipe-confirmed").click(function(e){ 286*4882a593Smuzhiyun e.preventDefault(); 287*4882a593Smuzhiyun libtoaster.disableAjaxLoadingTimer(); 288*4882a593Smuzhiyun $(this).find('[data-role="submit-state"]').hide(); 289*4882a593Smuzhiyun $(this).find('[data-role="loading-state"]').show(); 290*4882a593Smuzhiyun $(this).attr("disabled", "disabled"); 291*4882a593Smuzhiyun 292*4882a593Smuzhiyun $.ajax({ 293*4882a593Smuzhiyun type: 'DELETE', 294*4882a593Smuzhiyun url: ctx.recipe.xhrCustomRecipeUrl, 295*4882a593Smuzhiyun headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, 296*4882a593Smuzhiyun success: function (data) { 297*4882a593Smuzhiyun if (data.error !== "ok") { 298*4882a593Smuzhiyun console.warn(data.error); 299*4882a593Smuzhiyun } else { 300*4882a593Smuzhiyun var msg = $('<span>You have deleted <strong>1</strong> custom image: <strong id="deleted-custom-image-name"></strong></span>'); 301*4882a593Smuzhiyun msg.find("#deleted-custom-image-name").text(ctx.recipe.name); 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun libtoaster.setNotification("custom-image-recipe-deleted", 304*4882a593Smuzhiyun msg.html()); 305*4882a593Smuzhiyun 306*4882a593Smuzhiyun window.location.replace(data.gotoUrl); 307*4882a593Smuzhiyun } 308*4882a593Smuzhiyun }, 309*4882a593Smuzhiyun error: function (data) { 310*4882a593Smuzhiyun console.warn(data); 311*4882a593Smuzhiyun } 312*4882a593Smuzhiyun }); 313*4882a593Smuzhiyun }); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun /* Stop the download link from working if it is in disabled state 316*4882a593Smuzhiyun * http://getbootstrap.com/css/#forms-disabled-fieldsets 317*4882a593Smuzhiyun */ 318*4882a593Smuzhiyun $("a[disabled=disabled]").click(function(e){ 319*4882a593Smuzhiyun e.preventDefault(); 320*4882a593Smuzhiyun }); 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun} 323