"use strict"; function customRecipePageInit(ctx) { var urlParams = libtoaster.parseUrlParams(); var customiseTable = $("#selectpackagestable"); var addPkgDepsModalBtn = $("#add-package-deps-modal-btn"); var rmdPkgReverseDepsModalBtn = $("#rm-package-reverse-deps-modal-btn"); if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new'){ $("#image-created-notification").show(); } customiseTable.on('table-done', function(e, total){ /* Table is done so now setup the click handler for the package buttons */ $(".add-rm-package-btn").click(function(e){ e.preventDefault(); var targetPkg = $(this).data(); checkPackageDeps(targetPkg, function(pkgData){ if (targetPkg.directive === 'add'){ /* If we're adding a package we may need to show the modal to advise * on dependencies for this package. */ if (pkgData.unsatisfied_dependencies.length === 0){ addRemovePackage(targetPkg); } else { showPackageDepsModal(targetPkg, pkgData); } } else if (targetPkg.directive === 'remove') { if (pkgData.reverse_dependencies.length === 0){ addRemovePackage(targetPkg); } else { showPackageReverseDepsModal(targetPkg, pkgData); } } }); }); }); function checkPackageDeps(targetPkg, doneCb){ $.ajax({ type: 'GET', url: targetPkg.packageUrl, headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, success: function(data){ if (data.error !== 'ok'){ console.warn(data.error); return; } doneCb(data); } }); } function showPackageDepsModal(targetPkg, pkgData){ var modal = $("#package-deps-modal"); var depsList = modal.find("#package-add-dep-list"); var deps = pkgData.unsatisfied_dependencies; modal.find(".package-to-add-name").text(targetPkg.name); depsList.text(""); for (var i in deps){ var li = $('
').text(deps[i].name); li.append($('').text(" ("+ deps[i].size_formatted+")")); depsList.append(li); } modal.find("#package-deps-total-size").text( pkgData.unsatisfied_dependencies_size_formatted); targetPkg.depsAdded = deps; addPkgDepsModalBtn.data(targetPkg); modal.modal('show'); } addPkgDepsModalBtn.click(function(e){ e.preventDefault(); addRemovePackage($(this).data(), null); }); function showPackageReverseDepsModal(targetPkg, pkgData){ var modal = $("#package-reverse-deps-modal"); var depsList = modal.find("#package-reverse-dep-list"); var deps = pkgData.reverse_dependencies; var depsCount = deps.length; var vDepends = "depends"; var vPackage = "package"; var vThis = "this"; if (depsCount > 1) { vDepends = "depend"; vPackage = "packages"; vThis = "these"; } modal.find(".package-to-rm-name").text(targetPkg.name); modal.find(".reverse-deps-count").text(depsCount); modal.find(".reverse-deps-count-plus1").text((depsCount+1) + " packages"); modal.find(".reverse-deps-depends").text(vDepends); modal.find(".reverse-deps-package").text(vPackage); modal.find(".reverse-deps-this").text(vThis); depsList.text(""); for (var i in deps){ var li = $('').text(deps[i].name); li.append($('').text(" ("+ deps[i].size_formatted+")")); depsList.append(li); } modal.find("#package-reverse-deps-total-size").text( pkgData.reverse_dependencies_size_formatted); targetPkg.depsRemoved = deps; rmdPkgReverseDepsModalBtn.data(targetPkg); modal.modal('show'); } rmdPkgReverseDepsModalBtn.click(function(e){ e.preventDefault(); addRemovePackage($(this).data(), null); }); function addRemovePackage(targetPkg, tableParams){ var method; var msg = "You have "; var btnCell = $("#package-btn-cell-" + targetPkg.id); var inlineNotify = btnCell.children(".inline-notification"); var i; var dep; var depBtnCell; if (targetPkg.directive === 'add') { method = 'PUT'; /* If the package had dependencies also notify that they were added */ if (targetPkg.hasOwnProperty('depsAdded') && targetPkg.depsAdded.length > 0) { msg += "added "; msg += "" + (targetPkg.depsAdded.length + 1) + ""; msg += " packages to " + ctx.recipe.name + ": "; msg += "" + targetPkg.name + " and its dependencies"; for (i in targetPkg.depsAdded){ dep = targetPkg.depsAdded[i]; msg += " " + dep.name + ""; /* Add any cells currently in view to the list of cells which get * an list-inline notification inside them and which change add/rm state */ depBtnCell = $("#package-btn-cell-" + dep.pk); btnCell = btnCell.add(depBtnCell); inlineNotify = inlineNotify.add( depBtnCell.children(".inline-notification")); } inlineNotify.text( (targetPkg.depsAdded.length + 1) + " packages added"); } else { msg += "added 1"; msg += " package to " + ctx.recipe.name + ": "; msg += "" + targetPkg.name + ""; inlineNotify.text("1 package added"); } } else if (targetPkg.directive === 'remove') { method = 'DELETE'; var numPackageString = "1 package "; var revDepList = ""; if (targetPkg.hasOwnProperty('depsRemoved') && targetPkg.depsRemoved.length > 0) { var depsRemovedLength = targetPkg.depsRemoved.length; var ending = "y: "; var maxRevDepsDisplayed = 5; var d = 0; if (depsRemovedLength > 1) { ending = "ies: "; } numPackageString = (depsRemovedLength + 1) + " packages"; revDepList = " and its " + depsRemovedLength + " reverse dependenc" + ending; for (i in targetPkg.depsRemoved){ /* include up to maxRevDepsDisplayed rev deps on the page notification */ var notShownCount = depsRemovedLength - maxRevDepsDisplayed; dep = targetPkg.depsRemoved[i]; if (d < maxRevDepsDisplayed) { if (d > 0) { revDepList += ", "; } revDepList += dep.name; d++; if ((d === maxRevDepsDisplayed) && (notShownCount > 0)) { revDepList += " and " + notShownCount + " more"; } } /* Add any cells currently in view to the list of cells which get * an list-inline notification inside them and which change add/rm state */ depBtnCell = $("#package-btn-cell-" + dep.pk); btnCell = btnCell.add(depBtnCell); inlineNotify = inlineNotify.add( depBtnCell.children(".inline-notification")); } } msg+= "removed " + numPackageString + " from " + ctx.recipe.name + ":"; msg += " " + targetPkg.name + ""; msg += revDepList; inlineNotify.text(numPackageString + " removed"); } else { throw("Unknown package directive: should be add or remove"); } $.ajax({ type: method, url: targetPkg.packageUrl, headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, success: function(data){ if (data.error !== 'ok'){ console.warn(data.error); return; } libtoaster.showChangeNotification(msg); /* do the in-cell/inline notification to swap buttoms from add to * remove */ btnCell.children("button").fadeOut().promise().done(function(){ inlineNotify.fadeIn().delay(500).fadeOut(function(){ if (targetPkg.directive === 'add') btnCell.children("button[data-directive=remove]").fadeIn(); else btnCell.children("button[data-directive=add]").fadeIn(); }); }); /* Update the total num packages */ $.ajax({ type: "GET", url: ctx.recipe.xhrPackageListUrl, headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, success: function(data){ console.log(data); $("#total-num-packages").text(data.total); $("#total-size-packages").text(data.total_size_formatted); } }); } }); } $("#no-results-show-all-packages").click(function(){ $(".no-results-search-input").val(""); }); $("#no-results-remove-search-btn").click(function(){ $(".no-results-search-input").val(""); $(this).hide(); }); /* Trigger a build of your custom image */ $(".build-custom-image").click(function(){ libtoaster.startABuild(null, ctx.recipe.name, function(){ window.location.replace(libtoaster.ctx.projectBuildsUrl); }); }); $("#delete-custom-recipe-confirmed").click(function(e){ e.preventDefault(); libtoaster.disableAjaxLoadingTimer(); $(this).find('[data-role="submit-state"]').hide(); $(this).find('[data-role="loading-state"]').show(); $(this).attr("disabled", "disabled"); $.ajax({ type: 'DELETE', url: ctx.recipe.xhrCustomRecipeUrl, headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, success: function (data) { if (data.error !== "ok") { console.warn(data.error); } else { var msg = $('You have deleted 1 custom image: '); msg.find("#deleted-custom-image-name").text(ctx.recipe.name); libtoaster.setNotification("custom-image-recipe-deleted", msg.html()); window.location.replace(data.gotoUrl); } }, error: function (data) { console.warn(data); } }); }); /* Stop the download link from working if it is in disabled state * http://getbootstrap.com/css/#forms-disabled-fieldsets */ $("a[disabled=disabled]").click(function(e){ e.preventDefault(); }); }