391 lines
12 KiB
JavaScript
391 lines
12 KiB
JavaScript
|
"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 = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Remove\"></span></li>");
|
||
|
|
||
|
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 = $('<li><div class="checkbox"><label><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() + ' ';
|
||
|
});
|
||
|
|
||
|
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 = $('<span>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 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 = $('<span>You have changed the distro to: <strong><span id="notify-machine-name"></span></strong></span>');
|
||
|
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 = $('<span>You have deleted <strong>1</strong> project: <strong id="project-deleted"></strong></span>');
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
}
|