diff options
author | Dave Cobbley <david.j.cobbley@linux.intel.com> | 2018-08-14 20:05:37 +0300 |
---|---|---|
committer | Brad Bishop <bradleyb@fuzziesquirrel.com> | 2018-08-23 04:26:31 +0300 |
commit | eb8dc40360f0cfef56fb6947cc817a547d6d9bc6 (patch) | |
tree | de291a73dc37168da6370e2cf16c347d1eba9df8 /poky/bitbake/lib/toaster/toastergui/static/js/layerdetails.js | |
parent | 9c3cf826d853102535ead04cebc2d6023eff3032 (diff) | |
download | openbmc-eb8dc40360f0cfef56fb6947cc817a547d6d9bc6.tar.xz |
[Subtree] Removing import-layers directory
As part of the move to subtrees, need to bring all the import layers
content to the top level.
Change-Id: I4a163d10898cbc6e11c27f776f60e1a470049d8f
Signed-off-by: Dave Cobbley <david.j.cobbley@linux.intel.com>
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
Diffstat (limited to 'poky/bitbake/lib/toaster/toastergui/static/js/layerdetails.js')
-rw-r--r-- | poky/bitbake/lib/toaster/toastergui/static/js/layerdetails.js | 521 |
1 files changed, 521 insertions, 0 deletions
diff --git a/poky/bitbake/lib/toaster/toastergui/static/js/layerdetails.js b/poky/bitbake/lib/toaster/toastergui/static/js/layerdetails.js new file mode 100644 index 000000000..9ead393cb --- /dev/null +++ b/poky/bitbake/lib/toaster/toastergui/static/js/layerdetails.js @@ -0,0 +1,521 @@ +"use strict"; + +function layerDetailsPageInit (ctx) { + + var layerDepInput = $("#layer-dep-input"); + var layerDepBtn = $("#add-layer-dependency-btn"); + var layerDepsList = $("#layer-deps-list"); + var currentLayerDepSelection; + var addRmLayerBtn = $("#add-remove-layer-btn"); + var targetTab = $("#targets-tab"); + var machineTab = $("#machines-tab"); + var detailsTab = $("#details-tab"); + var editLayerSource = $("#edit-layer-source"); + var saveSourceChangesBtn = $("#save-changes-for-switch"); + var layerGitRefInput = $("#layer-git-ref"); + var layerSubDirInput = $('#layer-subdir'); + + targetTab.on('show.bs.tab', targetsTabShow); + detailsTab.on('show.bs.tab', detailsTabShow); + machineTab.on('show.bs.tab', machinesTabShow); + + /* setup the dependencies typeahead */ + libtoaster.makeTypeahead(layerDepInput, + libtoaster.ctx.layersTypeAheadUrl, + { include_added: "true" }, function(item){ + currentLayerDepSelection = item; + layerDepBtn.removeAttr("disabled"); + }); + + /* disable the add layer button if its input field is empty */ + layerDepInput.on("keyup",function(){ + if ($(this).val().length === 0) { + layerDepBtn.attr("disabled", "disabled"); + } + }); + + function addRemoveDep(depLayerId, add, doneCb) { + var data = { layer_version_id : ctx.layerVersion.id }; + if (add) + data.add_dep = depLayerId; + else + data.rm_dep = depLayerId; + + $.ajax({ + type: "POST", + url: ctx.xhrUpdateLayerUrl, + data: data, + headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, + success: function (data) { + if (data.error != "ok") { + console.warn(data.error); + } else { + doneCb(); + } + }, + error: function (data) { + console.warn("Call failed"); + console.warn(data); + } + }); + } + + function layerDepRemoveClick() { + var toRemove = $(this).parent().data('layer-id'); + var layerDepItem = $(this); + + addRemoveDep(toRemove, false, function(){ + layerDepItem.parent().fadeOut(function (){ + layerDepItem.remove(); + }); + }); + } + + /* Add dependency layer button click handler */ + layerDepBtn.click(function(){ + if (currentLayerDepSelection === undefined) + return; + + addRemoveDep(currentLayerDepSelection.id, true, function(){ + /* Make a list item for the new layer dependency */ + var newLayerDep = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Delete\"></span></li>"); + + newLayerDep.data('layer-id', currentLayerDepSelection.id); + newLayerDep.children("span").tooltip(); + + var link = newLayerDep.children("a"); + link.attr("href", currentLayerDepSelection.layerdetailurl); + link.text(currentLayerDepSelection.name); + link.tooltip({title: currentLayerDepSelection.tooltip, placement: "right"}); + + /* Connect up the tash icon */ + var trashItem = newLayerDep.children("span"); + trashItem.click(layerDepRemoveClick); + + layerDepsList.append(newLayerDep); + /* Clear the current selection */ + layerDepInput.val(""); + currentLayerDepSelection = undefined; + layerDepBtn.attr("disabled", "disabled"); + }); + }); + + $(".glyphicon-edit").click(function (){ + var mParent = $(this).parent("dd"); + mParent.prev().css("margin-top", "10px"); + mParent.children("form").slideDown(); + var currentVal = mParent.children(".current-value"); + currentVal.hide(); + /* Set the current value to the input field */ + mParent.find("textarea,input").val(currentVal.text()); + /* If the input field is empty, disable the submit button */ + if ( mParent.find("textarea,input").val().length == 0 ) { + mParent.find(".change-btn").attr("disabled", "disabled"); + } + /* Hides the "Not set" text */ + mParent.children(".text-muted").hide(); + /* We're editing so hide the delete icon */ + mParent.children(".delete-current-value").hide(); + mParent.find(".cancel").show(); + $(this).hide(); + }); + + $(".delete-current-value").click(function(){ + var mParent = $(this).parent("dd"); + mParent.find("input").val(""); + mParent.find("textarea").val(""); + mParent.find(".change-btn").click(); + }); + + $(".cancel").click(function(){ + var mParent = $(this).parents("dd"); + $(this).hide(); + mParent.children("form").slideUp(function(){ + mParent.children(".current-value").show(); + /* Show the "Not set" text if we ended up with no value */ + if (!mParent.children(".current-value").html()){ + mParent.children(".text-muted").fadeIn(); + mParent.children(".delete-current-value").hide(); + } else { + mParent.children(".delete-current-value").show(); + } + + mParent.children(".glyphicon-edit").show(); + mParent.prev().css("margin-top", "0"); + }); + }); + + + function defaultAddBtnText(){ + var text = " Add the "+ctx.layerVersion.name+" layer to your project"; + addRmLayerBtn.text(text); + addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>"); + addRmLayerBtn.removeClass("btn-danger"); + } + + function detailsTabShow(){ + if (!ctx.layerVersion.inCurrentPrj) + defaultAddBtnText(); + + window.location.hash = "information"; + } + + function targetsTabShow(){ + if (!ctx.layerVersion.inCurrentPrj){ + if (ctx.numTargets > 0) { + var text = " Add the "+ctx.layerVersion.name+" layer to your project "+ + "to enable these recipes"; + addRmLayerBtn.text(text); + addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>"); + } else { + defaultAddBtnText(); + } + } + + window.location.hash = "recipes"; + } + + $("#recipestable").on('table-done', function(e, total, tableParams){ + ctx.numTargets = total; + + if (total === 0 && !tableParams.search) { + $("#no-recipes-yet").show(); + } else { + $("#no-recipes-yet").hide(); + } + + targetTab.removeClass("text-muted"); + if (window.location.hash === "#recipes"){ + /* re run the machinesTabShow to update the text */ + targetsTabShow(); + } + }); + + $("#machinestable").on('table-done', function(e, total, tableParams){ + ctx.numMachines = total; + + if (total === 0 && !tableParams.search) + $("#no-machines-yet").show(); + else + $("#no-machines-yet").hide(); + + machineTab.removeClass("text-muted"); + if (window.location.hash === "#machines"){ + /* re run the machinesTabShow to update the text */ + machinesTabShow(); + } + + $(".select-machine-btn").click(function(e){ + if ($(this).hasClass("disabled")) + e.preventDefault(); + }); + + }); + + + function machinesTabShow(){ + if (!ctx.layerVersion.inCurrentPrj) { + if (ctx.numMachines > 0){ + var text = " Add the "+ctx.layerVersion.name+" layer to your project " + + "to enable these machines"; + addRmLayerBtn.text(text); + addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>"); + } else { + defaultAddBtnText(); + } + } + + window.location.hash = "machines"; + } + + $(".pagesize").change(function(){ + var search = libtoaster.parseUrlParams(); + search.limit = this.value; + + window.location.search = libtoaster.dumpsUrlParams(search); + }); + + /* Enables the Build target and Select Machine buttons and switches the + * add/remove button + */ + function setLayerInCurrentPrj(added) { + ctx.layerVersion.inCurrentPrj = added; + + if (added){ + /* enable and switch all the button states */ + $(".build-recipe-btn").removeClass("disabled"); + $(".select-machine-btn").removeClass("disabled"); + addRmLayerBtn.addClass("btn-danger"); + addRmLayerBtn.data('directive', "remove"); + addRmLayerBtn.text(" Remove the "+ctx.layerVersion.name+" layer from your project"); + addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-trash\"></span>"); + + } else { + /* disable and switch all the button states */ + $(".build-recipe-btn").addClass("disabled"); + $(".select-machine-btn").addClass("disabled"); + addRmLayerBtn.removeClass("btn-danger"); + addRmLayerBtn.data('directive', "add"); + + /* "special" handler so that we get the correct button text which depends + * on which tab is currently visible. Unfortunately we can't just call + * tab('show') as if it's already visible it doesn't run the event. + */ + switch ($(".nav-tabs .active a").prop('id')){ + case 'machines-tab': + machinesTabShow(); + break; + case 'targets-tab': + targetsTabShow(); + break; + default: + defaultAddBtnText(); + break; + } + } + } + + $("#dismiss-alert").click(function(){ + $(this).parent().fadeOut(); + }); + + /* Add or remove this layer from the project */ + addRmLayerBtn.click(function() { + + var add = ($(this).data('directive') === "add"); + + libtoaster.addRmLayer(ctx.layerVersion, add, function (layersList){ + var alertMsg = $("#alert-msg"); + alertMsg.html(libtoaster.makeLayerAddRmAlertMsg(ctx.layerVersion, layersList, add)); + + setLayerInCurrentPrj(add); + + libtoaster.showChangeNotification(alertMsg); + }); + }); + + /* Handler for all of the Change buttons */ + $(".change-btn").click(function(){ + var mParent = $(this).parent(); + var prop = $(this).data('layer-prop'); + + /* We have inputs, select and textareas to potentially grab the value + * from. + */ + var entryElement = mParent.find("input"); + if (entryElement.length === 0) + entryElement = mParent.find("textarea"); + if (entryElement.length === 0) { + console.warn("Could not find element to get data from for this change"); + return; + } + + var data = { layer_version_id: ctx.layerVersion.id }; + data[prop] = entryElement.val(); + + $.ajax({ + type: "POST", + url: ctx.xhrUpdateLayerUrl, + data: data, + headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, + success: function (data) { + if (data.error != "ok") { + console.warn(data.error); + } else { + /* success layer property changed */ + var inputArea = mParent.parents("dd"); + var text; + + text = entryElement.val(); + + /* Hide the "Not set" text if it's visible */ + inputArea.find(".text-muted").hide(); + inputArea.find(".current-value").text(text); + /* Same behaviour as cancel in that we hide the form/show current + * value. + */ + inputArea.find(".cancel").click(); + } + }, + error: function (data) { + console.warn("Call failed"); + console.warn(data); + } + }); + }); + + /* Disable the change button when we have no data in the input */ + $("dl input, dl textarea").on("input",function() { + if ($(this).val().length === 0) + $(this).parent().next(".change-btn").attr("disabled", "disabled"); + else + $(this).parent().next(".change-btn").removeAttr("disabled"); + }); + + /* This checks to see if the dt's dd has data in it or if the change data + * form is visible, otherwise hide it + */ + $("dl").children().each(function (){ + if ($(this).is("dt")) { + var dd = $(this).next("dd"); + if (!dd.children("form:visible")|| !dd.find(".current-value").html()){ + if (ctx.layerVersion.layer_source == ctx.layerSourceTypes.TYPE_IMPORTED){ + /* There's no current value and the layer is editable + * so show the "Not set" and hide the delete icon + */ + dd.find(".text-muted").show(); + dd.find(".delete-current-value").hide(); + } else { + /* We're not viewing an editable layer so hide the empty dd/dl pair */ + $(this).hide(); + dd.hide(); + } + } + } + }); + + /* Hide the right column if it contains no information */ + if ($("dl.item-info").children(':visible').length === 0) { + $("dl.item-info").parent().hide(); + } + + /* Clear the current search selection and reload the results */ + $(".target-search-clear").click(function(){ + $("#target-search").val(""); + $(this).parents("form").submit(); + }); + + $(".machine-search-clear").click(function(){ + $("#machine-search").val(""); + $(this).parents("form").submit(); + }); + + $("#layer-delete-confirmed").click(function(){ + + $("#delete-layer-modal button[data-dismiss='modal']").hide(); + + var message = $('<span>You have deleted <strong>1</strong> layer from your project: <strong id="deleted-layer-name"></strong>'); + message.find("#deleted-layer-name").text(ctx.layerVersion.name); + + $.ajax({ + type: "DELETE", + url: ctx.xhrUpdateLayerUrl, + headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, + success: function(data) { + if (data.error != "ok") { + console.warn(data.error); + } else { + libtoaster.setNotification("layer-deleted", message.html()); + window.location.replace(data.gotoUrl); + } + }, + error: function(data) { + console.warn("Call failed"); + console.warn(data); + } + }); + }); + + layerDepsList.find(".glyphicon-trash").click(layerDepRemoveClick); + layerDepsList.find("a").tooltip(); + $(".glyphicon-trash").tooltip(); + $(".commit").tooltip(); + + editLayerSource.click(function() { + /* Kindly bring the git layers imported from layerindex to normal page + * and not this new page :( + */ + $(this).hide(); + saveSourceChangesBtn.attr("disabled", "disabled"); + + $("#git-repo-info, #directory-info").hide(); + $("#edit-layer-source-form").fadeIn(); + if ($("#layer-dir-path-in-details").val() == "") { + //Local dir path is empty... + $("#repo").prop("checked", true); + $("#layer-git").fadeIn(); + $("#layer-dir").hide(); + } else { + $("#layer-git").hide(); + $("#layer-dir").fadeIn(); + } + }); + + $('input:radio[name="source-location"]').change(function() { + if ($('input[name=source-location]:checked').val() == "repo") { + $("#layer-git").fadeIn(); + $("#layer-dir").hide(); + if ($("#layer-git-repo-url").val().length === 0 && layerGitRefInput.val().length === 0) { + saveSourceChangesBtn.attr("disabled", "disabled"); + } + } else { + $("#layer-dir").fadeIn(); + $("#layer-git").hide(); + } + }); + + $("#layer-dir-path-in-details").keyup(function() { + saveSourceChangesBtn.removeAttr("disabled"); + }); + + $("#layer-git-repo-url").keyup(function() { + if ($("#layer-git-repo-url").val().length > 0 && layerGitRefInput.val().length > 0) { + saveSourceChangesBtn.removeAttr("disabled"); + } + }); + + layerGitRefInput.keyup(function() { + if ($("#layer-git-repo-url").val().length > 0 && layerGitRefInput.val().length > 0) { + saveSourceChangesBtn.removeAttr("disabled"); + } + }); + + + layerSubDirInput.keyup(function(){ + if ($(this).val().length > 0){ + saveSourceChangesBtn.removeAttr("disabled"); + } + }); + + $('#cancel-changes-for-switch').click(function() { + $("#edit-layer-source-form").hide(); + $("#directory-info, #git-repo-info").fadeIn(); + editLayerSource.show(); + }); + + saveSourceChangesBtn.click(function() { + + var layerData = { + vcs_url: $('#layer-git-repo-url').val(), + commit: layerGitRefInput.val(), + dirpath: layerSubDirInput.val(), + local_source_dir: $('#layer-dir-path-in-details').val(), + }; + + if ($('input[name=source-location]:checked').val() == "repo") { + layerData.local_source_dir = ""; + } else { + layerData.vcs_url = ""; + layerData.git_ref = ""; + } + + $.ajax({ + type: "POST", + url: ctx.xhrUpdateLayerUrl, + data: layerData, + headers: { 'X-CSRFToken' : $.cookie('csrftoken')}, + success: function (data) { + if (data.error != "ok") { + console.warn(data.error); + } else { + /* success layer property changed */ + window.location.reload(); + } + }, + error: function (data) { + console.warn("Call failed"); + console.warn(data); + } + }); + }); +} |