1*4882a593Smuzhiyun"use strict"; 2*4882a593Smuzhiyun 3*4882a593Smuzhiyunfunction projectPageInit(ctx) { 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun var layerAddInput = $("#layer-add-input"); 6*4882a593Smuzhiyun var layersInPrjList = $("#layers-in-project-list"); 7*4882a593Smuzhiyun var layerAddBtn = $("#add-layer-btn"); 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun var machineChangeInput = $("#machine-change-input"); 10*4882a593Smuzhiyun var machineChangeBtn = $("#machine-change-btn"); 11*4882a593Smuzhiyun var machineForm = $("#select-machine-form"); 12*4882a593Smuzhiyun var machineChangeFormToggle = $("#change-machine-toggle"); 13*4882a593Smuzhiyun var machineNameTitle = $("#project-machine-name"); 14*4882a593Smuzhiyun var machineChangeCancel = $("#cancel-machine-change"); 15*4882a593Smuzhiyun var machineInputForm = $("#machine-input-form"); 16*4882a593Smuzhiyun var invalidMachineNameHelp = $("#invalid-machine-name-help"); 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun var distroChangeInput = $("#distro-change-input"); 19*4882a593Smuzhiyun var distroChangeBtn = $("#distro-change-btn"); 20*4882a593Smuzhiyun var distroForm = $("#select-distro-form"); 21*4882a593Smuzhiyun var distroChangeFormToggle = $("#change-distro-toggle"); 22*4882a593Smuzhiyun var distroNameTitle = $("#project-distro-name"); 23*4882a593Smuzhiyun var distroChangeCancel = $("#cancel-distro-change"); 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun var freqBuildBtn = $("#freq-build-btn"); 26*4882a593Smuzhiyun var freqBuildList = $("#freq-build-list"); 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun var releaseChangeFormToggle = $("#release-change-toggle"); 29*4882a593Smuzhiyun var releaseTitle = $("#project-release-title"); 30*4882a593Smuzhiyun var releaseForm = $("#change-release-form"); 31*4882a593Smuzhiyun var releaseModal = $("#change-release-modal"); 32*4882a593Smuzhiyun var cancelReleaseChange = $("#cancel-release-change"); 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun var currentLayerAddSelection; 35*4882a593Smuzhiyun var currentMachineAddSelection = ""; 36*4882a593Smuzhiyun var currentDistroAddSelection = ""; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun var urlParams = libtoaster.parseUrlParams(); 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun libtoaster.getProjectInfo(libtoaster.ctx.xhrProjectUrl, function(prjInfo){ 41*4882a593Smuzhiyun updateProjectLayers(prjInfo.layers); 42*4882a593Smuzhiyun updateFreqBuildRecipes(prjInfo.freqtargets); 43*4882a593Smuzhiyun updateProjectRelease(prjInfo.release); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /* If we're receiving a machine set from the url and it's different from 46*4882a593Smuzhiyun * our current machine then activate set machine sequence. 47*4882a593Smuzhiyun */ 48*4882a593Smuzhiyun if (urlParams.hasOwnProperty('setMachine') && 49*4882a593Smuzhiyun urlParams.setMachine !== prjInfo.machine.name){ 50*4882a593Smuzhiyun machineChangeInput.val(urlParams.setMachine); 51*4882a593Smuzhiyun machineChangeBtn.click(); 52*4882a593Smuzhiyun } else { 53*4882a593Smuzhiyun updateMachineName(prjInfo.machine.name); 54*4882a593Smuzhiyun } 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /* If we're receiving a distro set from the url and it's different from 57*4882a593Smuzhiyun * our current distro then activate set machine sequence. 58*4882a593Smuzhiyun */ 59*4882a593Smuzhiyun if (urlParams.hasOwnProperty('setDistro') && 60*4882a593Smuzhiyun urlParams.setDistro !== prjInfo.distro.name){ 61*4882a593Smuzhiyun distroChangeInput.val(urlParams.setDistro); 62*4882a593Smuzhiyun distroChangeBtn.click(); 63*4882a593Smuzhiyun } else { 64*4882a593Smuzhiyun updateDistroName(prjInfo.distro.name); 65*4882a593Smuzhiyun } 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* Now we're really ready show the page */ 68*4882a593Smuzhiyun $("#project-page").show(); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* Set the project name in the delete modal */ 71*4882a593Smuzhiyun $("#delete-project-modal .project-name").text(prjInfo.name); 72*4882a593Smuzhiyun }); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new-project'){ 75*4882a593Smuzhiyun $("#project-created-notification").show(); 76*4882a593Smuzhiyun } 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun /* Add/Rm layer functionality */ 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun libtoaster.makeTypeahead(layerAddInput, libtoaster.ctx.layersTypeAheadUrl, { include_added: "false" }, function(item){ 81*4882a593Smuzhiyun currentLayerAddSelection = item; 82*4882a593Smuzhiyun layerAddBtn.removeAttr("disabled"); 83*4882a593Smuzhiyun }); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun layerAddInput.keyup(function() { 86*4882a593Smuzhiyun if ($(this).val().length == 0) { 87*4882a593Smuzhiyun layerAddBtn.attr("disabled", "disabled") 88*4882a593Smuzhiyun } 89*4882a593Smuzhiyun }); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun layerAddBtn.click(function(e){ 92*4882a593Smuzhiyun e.preventDefault(); 93*4882a593Smuzhiyun var layerObj = currentLayerAddSelection; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun addRmLayer(layerObj, true); 96*4882a593Smuzhiyun /* Reset the text input */ 97*4882a593Smuzhiyun layerAddInput.val(""); 98*4882a593Smuzhiyun /* Disable the add layer button*/ 99*4882a593Smuzhiyun layerAddBtn.attr("disabled", "disabled"); 100*4882a593Smuzhiyun }); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun function addRmLayer(layerObj, add){ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun libtoaster.addRmLayer(layerObj, add, function(layerDepsList){ 105*4882a593Smuzhiyun if (add){ 106*4882a593Smuzhiyun updateProjectLayers([layerObj]); 107*4882a593Smuzhiyun updateProjectLayers(layerDepsList); 108*4882a593Smuzhiyun } 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* Show the alert message */ 111*4882a593Smuzhiyun var message = libtoaster.makeLayerAddRmAlertMsg(layerObj, layerDepsList, add); 112*4882a593Smuzhiyun libtoaster.showChangeNotification(message); 113*4882a593Smuzhiyun }); 114*4882a593Smuzhiyun } 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun function updateProjectLayers(layers){ 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* No layers to add */ 119*4882a593Smuzhiyun if (layers.length === 0){ 120*4882a593Smuzhiyun updateLayersCount(); 121*4882a593Smuzhiyun return; 122*4882a593Smuzhiyun } 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun for (var i in layers){ 125*4882a593Smuzhiyun var layerObj = layers[i]; 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun var projectLayer = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Remove\"></span></li>"); 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun projectLayer.data('layer', layerObj); 130*4882a593Smuzhiyun projectLayer.children("span").tooltip(); 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun var link = projectLayer.children("a"); 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun link.attr("href", layerObj.layerdetailurl); 135*4882a593Smuzhiyun link.text(layerObj.name); 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun if (layerObj.local_source_dir) { 138*4882a593Smuzhiyun link.tooltip({title: layerObj.local_source_dir, placement: "right"}); 139*4882a593Smuzhiyun } else { 140*4882a593Smuzhiyun link.tooltip({title: layerObj.vcs_url + " | "+ layerObj.vcs_reference, placement: "right"}); 141*4882a593Smuzhiyun } 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun var trashItem = projectLayer.children("span"); 144*4882a593Smuzhiyun trashItem.click(function (e) { 145*4882a593Smuzhiyun e.preventDefault(); 146*4882a593Smuzhiyun var layerObjToRm = $(this).parent().data('layer'); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun addRmLayer(layerObjToRm, false); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun $(this).parent().fadeOut(function (){ 151*4882a593Smuzhiyun $(this).remove(); 152*4882a593Smuzhiyun updateLayersCount(); 153*4882a593Smuzhiyun }); 154*4882a593Smuzhiyun }); 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun layersInPrjList.append(projectLayer); 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun updateLayersCount(); 159*4882a593Smuzhiyun } 160*4882a593Smuzhiyun } 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun function updateLayersCount(){ 163*4882a593Smuzhiyun var count = $("#layers-in-project-list").children().length; 164*4882a593Smuzhiyun var noLayerMsg = $("#no-layers-in-project"); 165*4882a593Smuzhiyun var buildInput = $("#build-input"); 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun 168*4882a593Smuzhiyun if (count === 0) { 169*4882a593Smuzhiyun noLayerMsg.fadeIn(); 170*4882a593Smuzhiyun $("#no-layers-in-project").fadeIn(); 171*4882a593Smuzhiyun buildInput.attr("disabled", "disabled"); 172*4882a593Smuzhiyun } else { 173*4882a593Smuzhiyun noLayerMsg.hide(); 174*4882a593Smuzhiyun buildInput.removeAttr("disabled"); 175*4882a593Smuzhiyun } 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun $("#project-layers-count").text(count); 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun return count; 180*4882a593Smuzhiyun } 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* Frequent builds functionality */ 183*4882a593Smuzhiyun function updateFreqBuildRecipes(recipes) { 184*4882a593Smuzhiyun var noMostBuilt = $("#no-most-built"); 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun if (recipes.length === 0){ 187*4882a593Smuzhiyun noMostBuilt.show(); 188*4882a593Smuzhiyun freqBuildBtn.hide(); 189*4882a593Smuzhiyun } else { 190*4882a593Smuzhiyun noMostBuilt.hide(); 191*4882a593Smuzhiyun freqBuildBtn.show(); 192*4882a593Smuzhiyun } 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun for (var i in recipes){ 195*4882a593Smuzhiyun var freqTargetCheck = $('<li><div class="checkbox"><label><input type="checkbox" /><span class="freq-target-name"></span></label></li>'); 196*4882a593Smuzhiyun freqTargetCheck.find(".freq-target-name").text(recipes[i]); 197*4882a593Smuzhiyun freqTargetCheck.find("input").val(recipes[i]); 198*4882a593Smuzhiyun freqTargetCheck.click(function(){ 199*4882a593Smuzhiyun if (freqBuildList.find(":checked").length > 0) 200*4882a593Smuzhiyun freqBuildBtn.removeAttr("disabled"); 201*4882a593Smuzhiyun else 202*4882a593Smuzhiyun freqBuildBtn.attr("disabled", "disabled"); 203*4882a593Smuzhiyun }); 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun freqBuildList.append(freqTargetCheck); 206*4882a593Smuzhiyun } 207*4882a593Smuzhiyun } 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun freqBuildBtn.click(function(e){ 210*4882a593Smuzhiyun e.preventDefault(); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun var toBuild = ""; 213*4882a593Smuzhiyun freqBuildList.find(":checked").each(function(){ 214*4882a593Smuzhiyun toBuild += $(this).val() + ' '; 215*4882a593Smuzhiyun }); 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun toBuild = toBuild.trim(); 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun libtoaster.startABuild(null, toBuild, 220*4882a593Smuzhiyun function(){ 221*4882a593Smuzhiyun /* Build request started */ 222*4882a593Smuzhiyun window.location.replace(libtoaster.ctx.projectBuildsUrl); 223*4882a593Smuzhiyun }, 224*4882a593Smuzhiyun function(){ 225*4882a593Smuzhiyun /* Build request failed */ 226*4882a593Smuzhiyun console.warn("Build request failed to be created"); 227*4882a593Smuzhiyun }); 228*4882a593Smuzhiyun }); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun /* Change machine functionality */ 232*4882a593Smuzhiyun machineChangeInput.keyup(function(){ 233*4882a593Smuzhiyun if ($(this).val().indexOf(' ') >= 0) { 234*4882a593Smuzhiyun machineChangeBtn.attr("disabled", "disabled"); 235*4882a593Smuzhiyun invalidMachineNameHelp.show(); 236*4882a593Smuzhiyun machineInputForm.addClass('has-error'); 237*4882a593Smuzhiyun } else { 238*4882a593Smuzhiyun machineChangeBtn.removeAttr("disabled"); 239*4882a593Smuzhiyun invalidMachineNameHelp.hide(); 240*4882a593Smuzhiyun machineInputForm.removeClass('has-error'); 241*4882a593Smuzhiyun } 242*4882a593Smuzhiyun }); 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun machineChangeFormToggle.click(function(){ 245*4882a593Smuzhiyun machineChangeInput.val(machineNameTitle.text()); 246*4882a593Smuzhiyun machineChangeBtn.removeAttr("disabled"); 247*4882a593Smuzhiyun invalidMachineNameHelp.hide(); 248*4882a593Smuzhiyun machineInputForm.removeClass('has-error'); 249*4882a593Smuzhiyun machineForm.slideDown(); 250*4882a593Smuzhiyun machineNameTitle.hide(); 251*4882a593Smuzhiyun $(this).hide(); 252*4882a593Smuzhiyun }); 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun machineChangeCancel.click(function(){ 255*4882a593Smuzhiyun machineForm.slideUp(function(){ 256*4882a593Smuzhiyun machineNameTitle.show(); 257*4882a593Smuzhiyun machineChangeFormToggle.show(); 258*4882a593Smuzhiyun }); 259*4882a593Smuzhiyun }); 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun function updateMachineName(machineName){ 262*4882a593Smuzhiyun machineChangeInput.val(machineName); 263*4882a593Smuzhiyun machineNameTitle.text(machineName); 264*4882a593Smuzhiyun } 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun libtoaster.makeTypeahead(machineChangeInput, 267*4882a593Smuzhiyun libtoaster.ctx.machinesTypeAheadUrl, 268*4882a593Smuzhiyun { }, function(item){ 269*4882a593Smuzhiyun currentMachineAddSelection = item.name; 270*4882a593Smuzhiyun machineChangeBtn.removeAttr("disabled"); 271*4882a593Smuzhiyun }); 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun machineChangeBtn.click(function(e){ 274*4882a593Smuzhiyun e.preventDefault(); 275*4882a593Smuzhiyun /* We accept any value regardless of typeahead selection or not */ 276*4882a593Smuzhiyun if (machineChangeInput.val().length === 0) 277*4882a593Smuzhiyun return; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun currentMachineAddSelection = machineChangeInput.val(); 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun libtoaster.editCurrentProject( 282*4882a593Smuzhiyun { machineName : currentMachineAddSelection }, 283*4882a593Smuzhiyun function(){ 284*4882a593Smuzhiyun /* Success machine changed */ 285*4882a593Smuzhiyun updateMachineName(currentMachineAddSelection); 286*4882a593Smuzhiyun machineChangeCancel.click(); 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /* Show the alert message */ 289*4882a593Smuzhiyun var message = $('<span>You have changed the machine to: <strong><span id="notify-machine-name"></span></strong></span>'); 290*4882a593Smuzhiyun message.find("#notify-machine-name").text(currentMachineAddSelection); 291*4882a593Smuzhiyun libtoaster.showChangeNotification(message); 292*4882a593Smuzhiyun }, 293*4882a593Smuzhiyun function(){ 294*4882a593Smuzhiyun /* Failed machine changed */ 295*4882a593Smuzhiyun console.warn("Failed to change machine"); 296*4882a593Smuzhiyun }); 297*4882a593Smuzhiyun }); 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun 300*4882a593Smuzhiyun /* Change distro functionality */ 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun distroChangeFormToggle.click(function(){ 303*4882a593Smuzhiyun distroForm.slideDown(); 304*4882a593Smuzhiyun distroNameTitle.hide(); 305*4882a593Smuzhiyun $(this).hide(); 306*4882a593Smuzhiyun }); 307*4882a593Smuzhiyun 308*4882a593Smuzhiyun distroChangeCancel.click(function(){ 309*4882a593Smuzhiyun distroForm.slideUp(function(){ 310*4882a593Smuzhiyun distroNameTitle.show(); 311*4882a593Smuzhiyun distroChangeFormToggle.show(); 312*4882a593Smuzhiyun }); 313*4882a593Smuzhiyun }); 314*4882a593Smuzhiyun 315*4882a593Smuzhiyun function updateDistroName(distroName){ 316*4882a593Smuzhiyun distroChangeInput.val(distroName); 317*4882a593Smuzhiyun distroNameTitle.text(distroName); 318*4882a593Smuzhiyun } 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun libtoaster.makeTypeahead(distroChangeInput, 321*4882a593Smuzhiyun libtoaster.ctx.distrosTypeAheadUrl, 322*4882a593Smuzhiyun { }, function(item){ 323*4882a593Smuzhiyun currentDistroAddSelection = item.name; 324*4882a593Smuzhiyun distroChangeBtn.removeAttr("disabled"); 325*4882a593Smuzhiyun }); 326*4882a593Smuzhiyun 327*4882a593Smuzhiyun distroChangeBtn.click(function(e){ 328*4882a593Smuzhiyun e.preventDefault(); 329*4882a593Smuzhiyun /* We accept any value regardless of typeahead selection or not */ 330*4882a593Smuzhiyun if (distroChangeInput.val().length === 0) 331*4882a593Smuzhiyun return; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun currentDistroAddSelection = distroChangeInput.val(); 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun libtoaster.editCurrentProject( 336*4882a593Smuzhiyun { distroName : currentDistroAddSelection }, 337*4882a593Smuzhiyun function(){ 338*4882a593Smuzhiyun /* Success machine changed */ 339*4882a593Smuzhiyun updateDistroName(currentDistroAddSelection); 340*4882a593Smuzhiyun distroChangeCancel.click(); 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun /* Show the alert message */ 343*4882a593Smuzhiyun var message = $('<span>You have changed the distro to: <strong><span id="notify-machine-name"></span></strong></span>'); 344*4882a593Smuzhiyun message.find("#notify-machine-name").text(currentDistroAddSelection); 345*4882a593Smuzhiyun libtoaster.showChangeNotification(message); 346*4882a593Smuzhiyun }, 347*4882a593Smuzhiyun function(){ 348*4882a593Smuzhiyun /* Failed machine changed */ 349*4882a593Smuzhiyun console.warn("Failed to change distro"); 350*4882a593Smuzhiyun }); 351*4882a593Smuzhiyun }); 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* Change release functionality */ 355*4882a593Smuzhiyun function updateProjectRelease(release){ 356*4882a593Smuzhiyun releaseTitle.text(release.description); 357*4882a593Smuzhiyun } 358*4882a593Smuzhiyun 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun $("#delete-project-confirmed").click(function(e){ 361*4882a593Smuzhiyun e.preventDefault(); 362*4882a593Smuzhiyun libtoaster.disableAjaxLoadingTimer(); 363*4882a593Smuzhiyun $(this).find('[data-role="submit-state"]').hide(); 364*4882a593Smuzhiyun $(this).find('[data-role="loading-state"]').show(); 365*4882a593Smuzhiyun $(this).attr("disabled", "disabled"); 366*4882a593Smuzhiyun $('#delete-project-modal [data-dismiss="modal"]').hide(); 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun $.ajax({ 369*4882a593Smuzhiyun type: 'DELETE', 370*4882a593Smuzhiyun url: libtoaster.ctx.xhrProjectUrl, 371*4882a593Smuzhiyun headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, 372*4882a593Smuzhiyun success: function (data) { 373*4882a593Smuzhiyun if (data.error !== "ok") { 374*4882a593Smuzhiyun console.warn(data.error); 375*4882a593Smuzhiyun } else { 376*4882a593Smuzhiyun var msg = $('<span>You have deleted <strong>1</strong> project: <strong id="project-deleted"></strong></span>'); 377*4882a593Smuzhiyun 378*4882a593Smuzhiyun msg.find("#project-deleted").text(libtoaster.ctx.projectName); 379*4882a593Smuzhiyun libtoaster.setNotification("project-deleted", msg.html()); 380*4882a593Smuzhiyun 381*4882a593Smuzhiyun window.location.replace(data.gotoUrl); 382*4882a593Smuzhiyun } 383*4882a593Smuzhiyun }, 384*4882a593Smuzhiyun error: function (data) { 385*4882a593Smuzhiyun console.warn(data); 386*4882a593Smuzhiyun } 387*4882a593Smuzhiyun }); 388*4882a593Smuzhiyun }); 389*4882a593Smuzhiyun 390*4882a593Smuzhiyun} 391