"use strict";
function projectPageInit(ctx) {
var layerAddInput = $("#layer-add-input");
var layersInPrjList = $("#layers-in-project-list");
var layerAddBtn = $("#add-layer-btn");
var machineChangeInput = $("#machine-change-input");
var machineChangeBtn = $("#machine-change-btn");
var machineForm = $("#select-machine-form");
var machineChangeFormToggle = $("#change-machine-toggle");
var machineNameTitle = $("#project-machine-name");
var machineChangeCancel = $("#cancel-machine-change");
var machineInputForm = $("#machine-input-form");
var invalidMachineNameHelp = $("#invalid-machine-name-help");
var distroChangeInput = $("#distro-change-input");
var distroChangeBtn = $("#distro-change-btn");
var distroForm = $("#select-distro-form");
var distroChangeFormToggle = $("#change-distro-toggle");
var distroNameTitle = $("#project-distro-name");
var distroChangeCancel = $("#cancel-distro-change");
var freqBuildBtn = $("#freq-build-btn");
var freqBuildList = $("#freq-build-list");
var releaseChangeFormToggle = $("#release-change-toggle");
var releaseTitle = $("#project-release-title");
var releaseForm = $("#change-release-form");
var releaseModal = $("#change-release-modal");
var cancelReleaseChange = $("#cancel-release-change");
var currentLayerAddSelection;
var currentMachineAddSelection = "";
var currentDistroAddSelection = "";
var urlParams = libtoaster.parseUrlParams();
libtoaster.getProjectInfo(libtoaster.ctx.xhrProjectUrl, function(prjInfo){
updateProjectLayers(prjInfo.layers);
updateFreqBuildRecipes(prjInfo.freqtargets);
updateProjectRelease(prjInfo.release);
/* If we're receiving a machine set from the url and it's different from
* our current machine then activate set machine sequence.
*/
if (urlParams.hasOwnProperty('setMachine') &&
urlParams.setMachine !== prjInfo.machine.name){
machineChangeInput.val(urlParams.setMachine);
machineChangeBtn.click();
} else {
updateMachineName(prjInfo.machine.name);
}
/* If we're receiving a distro set from the url and it's different from
* our current distro then activate set machine sequence.
*/
if (urlParams.hasOwnProperty('setDistro') &&
urlParams.setDistro !== prjInfo.distro.name){
distroChangeInput.val(urlParams.setDistro);
distroChangeBtn.click();
} else {
updateDistroName(prjInfo.distro.name);
}
/* Now we're really ready show the page */
$("#project-page").show();
/* Set the project name in the delete modal */
$("#delete-project-modal .project-name").text(prjInfo.name);
});
if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new-project'){
$("#project-created-notification").show();
}
/* Add/Rm layer functionality */
libtoaster.makeTypeahead(layerAddInput, libtoaster.ctx.layersTypeAheadUrl, { include_added: "false" }, function(item){
currentLayerAddSelection = item;
layerAddBtn.removeAttr("disabled");
});
layerAddInput.keyup(function() {
if ($(this).val().length == 0) {
layerAddBtn.attr("disabled", "disabled")
}
});
layerAddBtn.click(function(e){
e.preventDefault();
var layerObj = currentLayerAddSelection;
addRmLayer(layerObj, true);
/* Reset the text input */
layerAddInput.val("");
/* Disable the add layer button*/
layerAddBtn.attr("disabled", "disabled");
});
function addRmLayer(layerObj, add){
libtoaster.addRmLayer(layerObj, add, function(layerDepsList){
if (add){
updateProjectLayers([layerObj]);
updateProjectLayers(layerDepsList);
}
/* Show the alert message */
var message = libtoaster.makeLayerAddRmAlertMsg(layerObj, layerDepsList, add);
libtoaster.showChangeNotification(message);
});
}
function updateProjectLayers(layers){
/* No layers to add */
if (layers.length === 0){
updateLayersCount();
return;
}
for (var i in layers){
var layerObj = layers[i];
var projectLayer = $("
");
projectLayer.data('layer', layerObj);
projectLayer.children("span").tooltip();
var link = projectLayer.children("a");
link.attr("href", layerObj.layerdetailurl);
link.text(layerObj.name);
if (layerObj.local_source_dir) {
link.tooltip({title: layerObj.local_source_dir, placement: "right"});
} else {
link.tooltip({title: layerObj.vcs_url + " | "+ layerObj.vcs_reference, placement: "right"});
}
var trashItem = projectLayer.children("span");
trashItem.click(function (e) {
e.preventDefault();
var layerObjToRm = $(this).parent().data('layer');
addRmLayer(layerObjToRm, false);
$(this).parent().fadeOut(function (){
$(this).remove();
updateLayersCount();
});
});
layersInPrjList.append(projectLayer);
updateLayersCount();
}
}
function updateLayersCount(){
var count = $("#layers-in-project-list").children().length;
var noLayerMsg = $("#no-layers-in-project");
var buildInput = $("#build-input");
if (count === 0) {
noLayerMsg.fadeIn();
$("#no-layers-in-project").fadeIn();
buildInput.attr("disabled", "disabled");
} else {
noLayerMsg.hide();
buildInput.removeAttr("disabled");
}
$("#project-layers-count").text(count);
return count;
}
/* Frequent builds functionality */
function updateFreqBuildRecipes(recipes) {
var noMostBuilt = $("#no-most-built");
if (recipes.length === 0){
noMostBuilt.show();
freqBuildBtn.hide();
} else {
noMostBuilt.hide();
freqBuildBtn.show();
}
for (var i in recipes){
var freqTargetCheck = $('
');
freqTargetCheck.find(".freq-target-name").text(recipes[i]);
freqTargetCheck.find("input").val(recipes[i]);
freqTargetCheck.click(function(){
if (freqBuildList.find(":checked").length > 0)
freqBuildBtn.removeAttr("disabled");
else
freqBuildBtn.attr("disabled", "disabled");
});
freqBuildList.append(freqTargetCheck);
}
}
freqBuildBtn.click(function(e){
e.preventDefault();
var toBuild = "";
freqBuildList.find(":checked").each(function(){
toBuild += $(this).val() + ' ';
});
toBuild = toBuild.trim();
libtoaster.startABuild(null, toBuild,
function(){
/* Build request started */
window.location.replace(libtoaster.ctx.projectBuildsUrl);
},
function(){
/* Build request failed */
console.warn("Build request failed to be created");
});
});
/* Change machine functionality */
machineChangeInput.keyup(function(){
if ($(this).val().indexOf(' ') >= 0) {
machineChangeBtn.attr("disabled", "disabled");
invalidMachineNameHelp.show();
machineInputForm.addClass('has-error');
} else {
machineChangeBtn.removeAttr("disabled");
invalidMachineNameHelp.hide();
machineInputForm.removeClass('has-error');
}
});
machineChangeFormToggle.click(function(){
machineChangeInput.val(machineNameTitle.text());
machineChangeBtn.removeAttr("disabled");
invalidMachineNameHelp.hide();
machineInputForm.removeClass('has-error');
machineForm.slideDown();
machineNameTitle.hide();
$(this).hide();
});
machineChangeCancel.click(function(){
machineForm.slideUp(function(){
machineNameTitle.show();
machineChangeFormToggle.show();
});
});
function updateMachineName(machineName){
machineChangeInput.val(machineName);
machineNameTitle.text(machineName);
}
libtoaster.makeTypeahead(machineChangeInput,
libtoaster.ctx.machinesTypeAheadUrl,
{ }, function(item){
currentMachineAddSelection = item.name;
machineChangeBtn.removeAttr("disabled");
});
machineChangeBtn.click(function(e){
e.preventDefault();
/* We accept any value regardless of typeahead selection or not */
if (machineChangeInput.val().length === 0)
return;
currentMachineAddSelection = machineChangeInput.val();
libtoaster.editCurrentProject(
{ machineName : currentMachineAddSelection },
function(){
/* Success machine changed */
updateMachineName(currentMachineAddSelection);
machineChangeCancel.click();
/* Show the alert message */
var message = $('You have changed the machine to: ');
message.find("#notify-machine-name").text(currentMachineAddSelection);
libtoaster.showChangeNotification(message);
},
function(){
/* Failed machine changed */
console.warn("Failed to change machine");
});
});
/* Change distro functionality */
distroChangeFormToggle.click(function(){
distroForm.slideDown();
distroNameTitle.hide();
$(this).hide();
});
distroChangeCancel.click(function(){
distroForm.slideUp(function(){
distroNameTitle.show();
distroChangeFormToggle.show();
});
});
function updateDistroName(distroName){
distroChangeInput.val(distroName);
distroNameTitle.text(distroName);
}
libtoaster.makeTypeahead(distroChangeInput,
libtoaster.ctx.distrosTypeAheadUrl,
{ }, function(item){
currentDistroAddSelection = item.name;
distroChangeBtn.removeAttr("disabled");
});
distroChangeBtn.click(function(e){
e.preventDefault();
/* We accept any value regardless of typeahead selection or not */
if (distroChangeInput.val().length === 0)
return;
currentDistroAddSelection = distroChangeInput.val();
libtoaster.editCurrentProject(
{ distroName : currentDistroAddSelection },
function(){
/* Success machine changed */
updateDistroName(currentDistroAddSelection);
distroChangeCancel.click();
/* Show the alert message */
var message = $('You have changed the distro to: ');
message.find("#notify-machine-name").text(currentDistroAddSelection);
libtoaster.showChangeNotification(message);
},
function(){
/* Failed machine changed */
console.warn("Failed to change distro");
});
});
/* Change release functionality */
function updateProjectRelease(release){
releaseTitle.text(release.description);
}
$("#delete-project-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");
$('#delete-project-modal [data-dismiss="modal"]').hide();
$.ajax({
type: 'DELETE',
url: libtoaster.ctx.xhrProjectUrl,
headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
success: function (data) {
if (data.error !== "ok") {
console.warn(data.error);
} else {
var msg = $('You have deleted 1 project: ');
msg.find("#project-deleted").text(libtoaster.ctx.projectName);
libtoaster.setNotification("project-deleted", msg.html());
window.location.replace(data.gotoUrl);
}
},
error: function (data) {
console.warn(data);
}
});
});
}