blob: e742ef291a6a3d6c7fc25926ef90a8dc6cd6ca72 [file] [log] [blame]
"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 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 urlParams = libtoaster.parseUrlParams();
libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, function(prjInfo){
updateProjectLayers(prjInfo.layers);
updateFreqBuildRecipes(prjInfo.freqtargets);
updateProjectRelease(prjInfo.release);
updateProjectReleases(prjInfo.releases, 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);
}
/* Now we're really ready show the page */
$("#project-page").show();
});
(function notificationRequest(){
if (urlParams.hasOwnProperty('notify')){
switch (urlParams.notify){
case 'new-project':
$("#project-created-notification").show();
break;
case 'layer-imported':
layerImportedNotification();
break;
default:
break;
}
}
})();
/* Layer imported notification */
function layerImportedNotification(){
var imported = $.cookie("layer-imported-alert");
var message = "Layer imported";
if (!imported)
return;
else
imported = JSON.parse(imported);
if (imported.deps_added.length === 0) {
message = "You have imported <strong><a href=\""+imported.imported_layer.layerdetailurl+"\">"+imported.imported_layer.name+"</a></strong> and added it to your project.";
} else {
var links = "<a href=\""+imported.imported_layer.layerdetailurl+"\">"+imported.imported_layer.name+"</a>, ";
imported.deps_added.map (function(item, index){
links +='<a href="'+item.layerdetailurl+'">'+item.name+'</a>';
/*If we're at the last element we don't want the trailing comma */
if (imported.deps_added[index+1] !== undefined)
links += ', ';
});
/* Length + 1 here to do deps + the imported layer */
message = 'You have imported <strong><a href="'+imported.imported_layer.layerdetailurl+'">'+imported.imported_layer.name+'</a></strong> and added <strong>'+(imported.deps_added.length+1)+'</strong> layers to your project: <strong>'+links+'</strong>';
}
libtoaster.showChangeNotification(message);
$.removeCookie("layer-imported-alert", { path: "/"});
}
/* 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("");
});
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 = $("<li><a></a><span class=\"icon-trash\" data-toggle=\"tooltip\" title=\"Delete\"></span></li>");
projectLayer.data('layer', layerObj);
projectLayer.children("span").tooltip();
var link = projectLayer.children("a");
link.attr("href", layerObj.layerdetailurl);
link.text(layerObj.name);
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;
if (count === 0)
$("#no-layers-in-project").fadeIn();
else
$("#no-layers-in-project").hide();
$("#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 = $('<li><label class="checkbox"><input type="checkbox" /><span class="freq-target-name"></span></label></li>');
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();
});
libtoaster.startABuild(libtoaster.ctx.projectBuildsUrl, libtoaster.ctx.projectId, toBuild, function(){
/* Build started */
window.location.replace(libtoaster.ctx.projectBuildsUrl);
},
function(){
/* Build start failed */
/* [YOCTO #7995] */
window.location.replace(libtoaster.ctx.projectBuildsUrl);
});
});
/* Change machine functionality */
machineChangeFormToggle.click(function(){
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 = $('<span class="lead">You have changed the machine to: <strong><span id="notify-machine-name"></span></strong></span>');
message.find("#notify-machine-name").text(currentMachineAddSelection);
libtoaster.showChangeNotification(message);
},
function(){
/* Failed machine changed */
console.warn("Failed to change machine");
});
});
/* Change release functionality */
function updateProjectRelease(release){
releaseTitle.text(release.description);
}
function updateProjectReleases(releases, current){
for (var i in releases){
var releaseOption = $("<option></option>");
releaseOption.val(releases[i].id);
releaseOption.text(releases[i].description);
releaseOption.data('release', releases[i]);
if (releases[i].id == current.id)
releaseOption.attr("selected", "selected");
releaseForm.children("select").append(releaseOption);
}
}
releaseChangeFormToggle.click(function(){
releaseForm.slideDown();
releaseTitle.hide();
$(this).hide();
});
cancelReleaseChange.click(function(e){
e.preventDefault();
releaseForm.slideUp(function(){
releaseTitle.show();
releaseChangeFormToggle.show();
});
});
function changeProjectRelease(release, layersToRm){
libtoaster.editCurrentProject({ projectVersion : release.id },
function(){
/* Success */
/* Update layers list with new layers */
layersInPrjList.addClass('muted');
libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl,
function(prjInfo){
layersInPrjList.children().remove();
updateProjectLayers(prjInfo.layers);
layersInPrjList.removeClass('muted');
releaseChangedNotification(release, prjInfo.layers, layersToRm);
});
updateProjectRelease(release);
cancelReleaseChange.click();
});
}
/* Create a notification to show the changes to the layer configuration
* caused by changing a release.
*/
function releaseChangedNotification(release, layers, layersToRm){
var message;
if (layers.length === 0 && layersToRm.length === 0){
message = $('<span><span class="lead">You have changed the project release to: <strong><span id="notify-release-name"></span></strong>.');
message.find("#notify-release-name").text(release.description);
libtoaster.showChangeNotification(message);
return;
}
/* Create the whitespace separated list of layers removed */
var layersDelList = "";
layersToRm.map(function(layer, i){
layersDelList += layer.name;
if (layersToRm[i+1] !== undefined)
layersDelList += ', ';
});
message = $('<span><span class="lead">You have changed the project release to: <strong><span id="notify-release-name"></span></strong>. This has caused the following changes in your project layers:</span><ul id="notify-layers-changed-list"></ul></span>');
var changedList = message.find("#notify-layers-changed-list");
message.find("#notify-release-name").text(release.description);
/* Manually construct the list item for changed layers */
var li = '<li><strong>'+layers.length+'</strong> layers changed to the <strong>'+release.name+'</strong> release: ';
for (var i in layers){
li += '<a href='+layers[i].layerdetailurl+'>'+layers[i].name+'</a>';
if (i !== 0)
li += ', ';
}
changedList.append($(li));
/* Layers removed */
if (layersToRm && layersToRm.length > 0){
if (layersToRm.length == 1)
li = '<li><strong>1</strong> layer deleted: '+layersToRm[0].name+'</li>';
else
li = '<li><strong>'+layersToRm.length+'</strong> layers deleted: '+layersDelList+'</li>';
changedList.append($(li));
}
libtoaster.showChangeNotification(message);
}
/* Show the modal dialog which gives the option to remove layers which
* aren't compatible with the proposed release
*/
function showReleaseLayerChangeModal(release, layers){
var layersToRmList = releaseModal.find("#layers-to-remove-list");
layersToRmList.text("");
releaseModal.find(".proposed-release-change-name").text(release.description);
releaseModal.data("layers", layers);
releaseModal.data("release", release);
for (var i in layers){
layersToRmList.append($("<li></li>").text(layers[i].name));
}
releaseModal.modal('show');
}
$("#change-release-btn").click(function(e){
e.preventDefault();
var newRelease = releaseForm.find("option:selected").data('release');
$.getJSON(ctx.testReleaseChangeUrl,
{ new_release_id: newRelease.id },
function(layers) {
if (layers.rows.length === 0){
/* No layers to change for this release */
changeProjectRelease(newRelease, []);
} else {
showReleaseLayerChangeModal(newRelease, layers.rows);
}
});
});
/* Release change modal accept */
$("#change-release-and-rm-layers").click(function(){
var layers = releaseModal.data("layers");
var release = releaseModal.data("release");
changeProjectRelease(release, layers);
});
}