xref: /OK3568_Linux_fs/yocto/bitbake/lib/toaster/toastergui/static/js/layerdetails.js (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun"use strict";
2*4882a593Smuzhiyun
3*4882a593Smuzhiyunfunction layerDetailsPageInit (ctx) {
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun  var layerDepInput = $("#layer-dep-input");
6*4882a593Smuzhiyun  var layerDepBtn = $("#add-layer-dependency-btn");
7*4882a593Smuzhiyun  var layerDepsList = $("#layer-deps-list");
8*4882a593Smuzhiyun  var currentLayerDepSelection;
9*4882a593Smuzhiyun  var addRmLayerBtn = $("#add-remove-layer-btn");
10*4882a593Smuzhiyun  var targetTab = $("#targets-tab");
11*4882a593Smuzhiyun  var machineTab = $("#machines-tab");
12*4882a593Smuzhiyun  var detailsTab = $("#details-tab");
13*4882a593Smuzhiyun  var editLayerSource = $("#edit-layer-source");
14*4882a593Smuzhiyun  var saveSourceChangesBtn = $("#save-changes-for-switch");
15*4882a593Smuzhiyun  var layerGitRefInput = $("#layer-git-ref");
16*4882a593Smuzhiyun  var layerSubDirInput = $('#layer-subdir');
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun  targetTab.on('show.bs.tab', targetsTabShow);
19*4882a593Smuzhiyun  detailsTab.on('show.bs.tab', detailsTabShow);
20*4882a593Smuzhiyun  machineTab.on('show.bs.tab', machinesTabShow);
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun  /* setup the dependencies typeahead */
23*4882a593Smuzhiyun  libtoaster.makeTypeahead(layerDepInput,
24*4882a593Smuzhiyun                           libtoaster.ctx.layersTypeAheadUrl,
25*4882a593Smuzhiyun                           { include_added: "true" }, function(item){
26*4882a593Smuzhiyun    currentLayerDepSelection = item;
27*4882a593Smuzhiyun    layerDepBtn.removeAttr("disabled");
28*4882a593Smuzhiyun  });
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun  /* disable the add layer button if its input field is empty */
31*4882a593Smuzhiyun  layerDepInput.on("keyup",function(){
32*4882a593Smuzhiyun    if ($(this).val().length === 0) {
33*4882a593Smuzhiyun      layerDepBtn.attr("disabled", "disabled");
34*4882a593Smuzhiyun    }
35*4882a593Smuzhiyun  });
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun  function addRemoveDep(depLayerId, add, doneCb) {
38*4882a593Smuzhiyun    var data = { layer_version_id : ctx.layerVersion.id };
39*4882a593Smuzhiyun    if (add)
40*4882a593Smuzhiyun      data.add_dep = depLayerId;
41*4882a593Smuzhiyun    else
42*4882a593Smuzhiyun      data.rm_dep = depLayerId;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun    $.ajax({
45*4882a593Smuzhiyun        type: "POST",
46*4882a593Smuzhiyun        url: ctx.xhrUpdateLayerUrl,
47*4882a593Smuzhiyun        data: data,
48*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
49*4882a593Smuzhiyun        success: function (data) {
50*4882a593Smuzhiyun          if (data.error != "ok") {
51*4882a593Smuzhiyun            console.warn(data.error);
52*4882a593Smuzhiyun          } else {
53*4882a593Smuzhiyun            doneCb();
54*4882a593Smuzhiyun          }
55*4882a593Smuzhiyun        },
56*4882a593Smuzhiyun        error: function (data) {
57*4882a593Smuzhiyun          console.warn("Call failed");
58*4882a593Smuzhiyun          console.warn(data);
59*4882a593Smuzhiyun        }
60*4882a593Smuzhiyun    });
61*4882a593Smuzhiyun  }
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun  function layerDepRemoveClick() {
64*4882a593Smuzhiyun    var toRemove = $(this).parent().data('layer-id');
65*4882a593Smuzhiyun    var layerDepItem = $(this);
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun    addRemoveDep(toRemove, false, function(){
68*4882a593Smuzhiyun      layerDepItem.parent().fadeOut(function (){
69*4882a593Smuzhiyun        layerDepItem.remove();
70*4882a593Smuzhiyun      });
71*4882a593Smuzhiyun    });
72*4882a593Smuzhiyun  }
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun  /* Add dependency layer button click handler */
75*4882a593Smuzhiyun  layerDepBtn.click(function(){
76*4882a593Smuzhiyun    if (currentLayerDepSelection === undefined)
77*4882a593Smuzhiyun      return;
78*4882a593Smuzhiyun
79*4882a593Smuzhiyun    addRemoveDep(currentLayerDepSelection.id, true, function(){
80*4882a593Smuzhiyun      /* Make a list item for the new layer dependency */
81*4882a593Smuzhiyun      var newLayerDep = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Delete\"></span></li>");
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun      newLayerDep.data('layer-id', currentLayerDepSelection.id);
84*4882a593Smuzhiyun      newLayerDep.children("span").tooltip();
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun      var link = newLayerDep.children("a");
87*4882a593Smuzhiyun      link.attr("href", currentLayerDepSelection.layerdetailurl);
88*4882a593Smuzhiyun      link.text(currentLayerDepSelection.name);
89*4882a593Smuzhiyun      link.tooltip({title: currentLayerDepSelection.tooltip, placement: "right"});
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun      /* Connect up the tash icon */
92*4882a593Smuzhiyun      var trashItem = newLayerDep.children("span");
93*4882a593Smuzhiyun      trashItem.click(layerDepRemoveClick);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun      layerDepsList.append(newLayerDep);
96*4882a593Smuzhiyun      /* Clear the current selection */
97*4882a593Smuzhiyun      layerDepInput.val("");
98*4882a593Smuzhiyun      currentLayerDepSelection = undefined;
99*4882a593Smuzhiyun      layerDepBtn.attr("disabled", "disabled");
100*4882a593Smuzhiyun    });
101*4882a593Smuzhiyun  });
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun  $(".glyphicon-edit").click(function (){
104*4882a593Smuzhiyun    var mParent = $(this).parent("dd");
105*4882a593Smuzhiyun    mParent.prev().css("margin-top", "10px");
106*4882a593Smuzhiyun    mParent.children("form").slideDown();
107*4882a593Smuzhiyun    var currentVal = mParent.children(".current-value");
108*4882a593Smuzhiyun    currentVal.hide();
109*4882a593Smuzhiyun    /* Set the current value to the input field */
110*4882a593Smuzhiyun    mParent.find("textarea,input").val(currentVal.text());
111*4882a593Smuzhiyun    /* If the input field is empty, disable the submit button */
112*4882a593Smuzhiyun    if ( mParent.find("textarea,input").val().length == 0 ) {
113*4882a593Smuzhiyun      mParent.find(".change-btn").attr("disabled", "disabled");
114*4882a593Smuzhiyun    }
115*4882a593Smuzhiyun    /* Hides the "Not set" text */
116*4882a593Smuzhiyun    mParent.children(".text-muted").hide();
117*4882a593Smuzhiyun    /* We're editing so hide the delete icon */
118*4882a593Smuzhiyun    mParent.children(".delete-current-value").hide();
119*4882a593Smuzhiyun    mParent.find(".cancel").show();
120*4882a593Smuzhiyun    $(this).hide();
121*4882a593Smuzhiyun  });
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun  $(".delete-current-value").click(function(){
124*4882a593Smuzhiyun    var mParent = $(this).parent("dd");
125*4882a593Smuzhiyun    mParent.find("input").val("");
126*4882a593Smuzhiyun    mParent.find("textarea").val("");
127*4882a593Smuzhiyun    mParent.find(".change-btn").click();
128*4882a593Smuzhiyun  });
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun  $(".cancel").click(function(){
131*4882a593Smuzhiyun    var mParent = $(this).parents("dd");
132*4882a593Smuzhiyun    $(this).hide();
133*4882a593Smuzhiyun    mParent.children("form").slideUp(function(){
134*4882a593Smuzhiyun      mParent.children(".current-value").show();
135*4882a593Smuzhiyun      /* Show the "Not set" text if we ended up with no value */
136*4882a593Smuzhiyun      if (!mParent.children(".current-value").html()){
137*4882a593Smuzhiyun        mParent.children(".text-muted").fadeIn();
138*4882a593Smuzhiyun        mParent.children(".delete-current-value").hide();
139*4882a593Smuzhiyun      } else {
140*4882a593Smuzhiyun        mParent.children(".delete-current-value").show();
141*4882a593Smuzhiyun      }
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun      mParent.children(".glyphicon-edit").show();
144*4882a593Smuzhiyun      mParent.prev().css("margin-top", "0");
145*4882a593Smuzhiyun    });
146*4882a593Smuzhiyun  });
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun  function defaultAddBtnText(){
150*4882a593Smuzhiyun      var text = " Add the "+ctx.layerVersion.name+" layer to your project";
151*4882a593Smuzhiyun      addRmLayerBtn.text(text);
152*4882a593Smuzhiyun      addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>");
153*4882a593Smuzhiyun      addRmLayerBtn.removeClass("btn-danger");
154*4882a593Smuzhiyun  }
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun  function detailsTabShow(){
157*4882a593Smuzhiyun    if (!ctx.layerVersion.inCurrentPrj)
158*4882a593Smuzhiyun      defaultAddBtnText();
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun    window.location.hash = "information";
161*4882a593Smuzhiyun  }
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun  function targetsTabShow(){
164*4882a593Smuzhiyun    if (!ctx.layerVersion.inCurrentPrj){
165*4882a593Smuzhiyun      if (ctx.numTargets > 0) {
166*4882a593Smuzhiyun        var text = " Add the "+ctx.layerVersion.name+" layer to your project "+
167*4882a593Smuzhiyun          "to enable these recipes";
168*4882a593Smuzhiyun        addRmLayerBtn.text(text);
169*4882a593Smuzhiyun        addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>");
170*4882a593Smuzhiyun      } else {
171*4882a593Smuzhiyun        defaultAddBtnText();
172*4882a593Smuzhiyun      }
173*4882a593Smuzhiyun    }
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun    window.location.hash = "recipes";
176*4882a593Smuzhiyun  }
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun  $("#recipestable").on('table-done', function(e, total, tableParams){
179*4882a593Smuzhiyun    ctx.numTargets = total;
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun    if (total === 0 && !tableParams.search) {
182*4882a593Smuzhiyun      $("#no-recipes-yet").show();
183*4882a593Smuzhiyun    } else {
184*4882a593Smuzhiyun      $("#no-recipes-yet").hide();
185*4882a593Smuzhiyun    }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun    targetTab.removeClass("text-muted");
188*4882a593Smuzhiyun    if (window.location.hash === "#recipes"){
189*4882a593Smuzhiyun      /* re run the machinesTabShow to update the text */
190*4882a593Smuzhiyun      targetsTabShow();
191*4882a593Smuzhiyun    }
192*4882a593Smuzhiyun  });
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun  $("#machinestable").on('table-done', function(e, total, tableParams){
195*4882a593Smuzhiyun    ctx.numMachines = total;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun    if (total === 0 && !tableParams.search)
198*4882a593Smuzhiyun      $("#no-machines-yet").show();
199*4882a593Smuzhiyun    else
200*4882a593Smuzhiyun      $("#no-machines-yet").hide();
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun    machineTab.removeClass("text-muted");
203*4882a593Smuzhiyun    if (window.location.hash === "#machines"){
204*4882a593Smuzhiyun      /* re run the machinesTabShow to update the text */
205*4882a593Smuzhiyun      machinesTabShow();
206*4882a593Smuzhiyun    }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun    $(".select-machine-btn").click(function(e){
209*4882a593Smuzhiyun      if ($(this).hasClass("disabled"))
210*4882a593Smuzhiyun        e.preventDefault();
211*4882a593Smuzhiyun    });
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun  });
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun  function machinesTabShow(){
217*4882a593Smuzhiyun    if (!ctx.layerVersion.inCurrentPrj) {
218*4882a593Smuzhiyun      if (ctx.numMachines > 0){
219*4882a593Smuzhiyun        var text = " Add the "+ctx.layerVersion.name+" layer to your project " +
220*4882a593Smuzhiyun          "to enable these machines";
221*4882a593Smuzhiyun        addRmLayerBtn.text(text);
222*4882a593Smuzhiyun        addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-plus\"></span>");
223*4882a593Smuzhiyun      } else {
224*4882a593Smuzhiyun        defaultAddBtnText();
225*4882a593Smuzhiyun      }
226*4882a593Smuzhiyun    }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun    window.location.hash = "machines";
229*4882a593Smuzhiyun  }
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun  $(".pagesize").change(function(){
232*4882a593Smuzhiyun    var search = libtoaster.parseUrlParams();
233*4882a593Smuzhiyun    search.limit = this.value;
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun    window.location.search = libtoaster.dumpsUrlParams(search);
236*4882a593Smuzhiyun  });
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun  /* Enables the Build target and Select Machine buttons and switches the
239*4882a593Smuzhiyun   * add/remove button
240*4882a593Smuzhiyun   */
241*4882a593Smuzhiyun  function setLayerInCurrentPrj(added) {
242*4882a593Smuzhiyun    ctx.layerVersion.inCurrentPrj = added;
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun    if (added){
245*4882a593Smuzhiyun      /* enable and switch all the button states */
246*4882a593Smuzhiyun      $(".build-recipe-btn").removeClass("disabled");
247*4882a593Smuzhiyun      $(".select-machine-btn").removeClass("disabled");
248*4882a593Smuzhiyun      addRmLayerBtn.addClass("btn-danger");
249*4882a593Smuzhiyun      addRmLayerBtn.data('directive', "remove");
250*4882a593Smuzhiyun      addRmLayerBtn.text(" Remove the "+ctx.layerVersion.name+" layer from your project");
251*4882a593Smuzhiyun      addRmLayerBtn.prepend("<span class=\"glyphicon glyphicon-trash\"></span>");
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun    } else {
254*4882a593Smuzhiyun      /* disable and switch all the button states */
255*4882a593Smuzhiyun      $(".build-recipe-btn").addClass("disabled");
256*4882a593Smuzhiyun      $(".select-machine-btn").addClass("disabled");
257*4882a593Smuzhiyun      addRmLayerBtn.removeClass("btn-danger");
258*4882a593Smuzhiyun      addRmLayerBtn.data('directive', "add");
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun      /* "special" handler so that we get the correct button text which depends
261*4882a593Smuzhiyun       * on which tab is currently visible. Unfortunately we can't just call
262*4882a593Smuzhiyun       * tab('show') as if it's already visible it doesn't run the event.
263*4882a593Smuzhiyun       */
264*4882a593Smuzhiyun      switch ($(".nav-tabs .active a").prop('id')){
265*4882a593Smuzhiyun        case 'machines-tab':
266*4882a593Smuzhiyun          machinesTabShow();
267*4882a593Smuzhiyun          break;
268*4882a593Smuzhiyun        case 'targets-tab':
269*4882a593Smuzhiyun          targetsTabShow();
270*4882a593Smuzhiyun          break;
271*4882a593Smuzhiyun        default:
272*4882a593Smuzhiyun          defaultAddBtnText();
273*4882a593Smuzhiyun          break;
274*4882a593Smuzhiyun      }
275*4882a593Smuzhiyun    }
276*4882a593Smuzhiyun  }
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun  $("#dismiss-alert").click(function(){
279*4882a593Smuzhiyun    $(this).parent().fadeOut();
280*4882a593Smuzhiyun  });
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun  /* Add or remove this layer from the project */
283*4882a593Smuzhiyun  addRmLayerBtn.click(function() {
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun    var add = ($(this).data('directive') === "add");
286*4882a593Smuzhiyun
287*4882a593Smuzhiyun    libtoaster.addRmLayer(ctx.layerVersion, add, function (layersList){
288*4882a593Smuzhiyun      var alertMsg = $("#alert-msg");
289*4882a593Smuzhiyun      alertMsg.html(libtoaster.makeLayerAddRmAlertMsg(ctx.layerVersion, layersList, add));
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun      setLayerInCurrentPrj(add);
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun      libtoaster.showChangeNotification(alertMsg);
294*4882a593Smuzhiyun    });
295*4882a593Smuzhiyun  });
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun  /* Handler for all of the Change buttons */
298*4882a593Smuzhiyun  $(".change-btn").click(function(){
299*4882a593Smuzhiyun    var mParent = $(this).parent();
300*4882a593Smuzhiyun    var prop = $(this).data('layer-prop');
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun    /* We have inputs, select and textareas to potentially grab the value
303*4882a593Smuzhiyun     * from.
304*4882a593Smuzhiyun     */
305*4882a593Smuzhiyun    var entryElement = mParent.find("input");
306*4882a593Smuzhiyun    if (entryElement.length === 0)
307*4882a593Smuzhiyun      entryElement = mParent.find("textarea");
308*4882a593Smuzhiyun    if (entryElement.length === 0) {
309*4882a593Smuzhiyun      console.warn("Could not find element to get data from for this change");
310*4882a593Smuzhiyun      return;
311*4882a593Smuzhiyun    }
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun    var data = { layer_version_id: ctx.layerVersion.id };
314*4882a593Smuzhiyun    data[prop] = entryElement.val();
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun    $.ajax({
317*4882a593Smuzhiyun        type: "POST",
318*4882a593Smuzhiyun        url: ctx.xhrUpdateLayerUrl,
319*4882a593Smuzhiyun        data: data,
320*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
321*4882a593Smuzhiyun        success: function (data) {
322*4882a593Smuzhiyun          if (data.error != "ok") {
323*4882a593Smuzhiyun            console.warn(data.error);
324*4882a593Smuzhiyun          } else {
325*4882a593Smuzhiyun            /* success layer property changed */
326*4882a593Smuzhiyun            var inputArea = mParent.parents("dd");
327*4882a593Smuzhiyun            var text;
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun            text = entryElement.val();
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun            /* Hide the "Not set" text if it's visible */
332*4882a593Smuzhiyun            inputArea.find(".text-muted").hide();
333*4882a593Smuzhiyun            inputArea.find(".current-value").text(text);
334*4882a593Smuzhiyun            /* Same behaviour as cancel in that we hide the form/show current
335*4882a593Smuzhiyun             * value.
336*4882a593Smuzhiyun             */
337*4882a593Smuzhiyun            inputArea.find(".cancel").click();
338*4882a593Smuzhiyun          }
339*4882a593Smuzhiyun        },
340*4882a593Smuzhiyun        error: function (data) {
341*4882a593Smuzhiyun          console.warn("Call failed");
342*4882a593Smuzhiyun          console.warn(data);
343*4882a593Smuzhiyun        }
344*4882a593Smuzhiyun    });
345*4882a593Smuzhiyun  });
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun  /* Disable the change button when we have no data in the input */
348*4882a593Smuzhiyun  $("dl input, dl textarea").on("input",function() {
349*4882a593Smuzhiyun    if ($(this).val().length === 0)
350*4882a593Smuzhiyun      $(this).parent().next(".change-btn").attr("disabled", "disabled");
351*4882a593Smuzhiyun    else
352*4882a593Smuzhiyun      $(this).parent().next(".change-btn").removeAttr("disabled");
353*4882a593Smuzhiyun  });
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun  /* This checks to see if the dt's dd has data in it or if the change data
356*4882a593Smuzhiyun   * form is visible, otherwise hide it
357*4882a593Smuzhiyun   */
358*4882a593Smuzhiyun  $("dl").children().each(function (){
359*4882a593Smuzhiyun    if ($(this).is("dt")) {
360*4882a593Smuzhiyun      var dd = $(this).next("dd");
361*4882a593Smuzhiyun      if (!dd.children("form:visible")|| !dd.find(".current-value").html()){
362*4882a593Smuzhiyun        if (ctx.layerVersion.layer_source == ctx.layerSourceTypes.TYPE_IMPORTED ||
363*4882a593Smuzhiyun            ctx.layerVersion.layer_source == ctx.layerSourceTypes.TYPE_LOCAL) {
364*4882a593Smuzhiyun        /* There's no current value and the layer is editable
365*4882a593Smuzhiyun         * so show the "Not set" and hide the delete icon
366*4882a593Smuzhiyun         */
367*4882a593Smuzhiyun        dd.find(".text-muted").show();
368*4882a593Smuzhiyun        dd.find(".delete-current-value").hide();
369*4882a593Smuzhiyun        } else {
370*4882a593Smuzhiyun          /* We're not viewing an editable layer so hide the empty dd/dl pair */
371*4882a593Smuzhiyun          $(this).hide();
372*4882a593Smuzhiyun          dd.hide();
373*4882a593Smuzhiyun        }
374*4882a593Smuzhiyun      }
375*4882a593Smuzhiyun    }
376*4882a593Smuzhiyun  });
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun  /* Hide the right column if it contains no information */
379*4882a593Smuzhiyun  if ($("dl.item-info").children(':visible').length === 0) {
380*4882a593Smuzhiyun    $("dl.item-info").parent().hide();
381*4882a593Smuzhiyun  }
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun  /* Clear the current search selection and reload the results */
384*4882a593Smuzhiyun  $(".target-search-clear").click(function(){
385*4882a593Smuzhiyun    $("#target-search").val("");
386*4882a593Smuzhiyun    $(this).parents("form").submit();
387*4882a593Smuzhiyun  });
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun  $(".machine-search-clear").click(function(){
390*4882a593Smuzhiyun    $("#machine-search").val("");
391*4882a593Smuzhiyun    $(this).parents("form").submit();
392*4882a593Smuzhiyun  });
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun  $("#layer-delete-confirmed").click(function(){
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun    $("#delete-layer-modal button[data-dismiss='modal']").hide();
397*4882a593Smuzhiyun
398*4882a593Smuzhiyun    var message = $('<span>You have deleted <strong>1</strong> layer from your project: <strong id="deleted-layer-name"></strong>');
399*4882a593Smuzhiyun    message.find("#deleted-layer-name").text(ctx.layerVersion.name);
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun    $.ajax({
402*4882a593Smuzhiyun        type: "DELETE",
403*4882a593Smuzhiyun        url: ctx.xhrUpdateLayerUrl,
404*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
405*4882a593Smuzhiyun        success: function(data) {
406*4882a593Smuzhiyun          if (data.error != "ok") {
407*4882a593Smuzhiyun            console.warn(data.error);
408*4882a593Smuzhiyun          } else {
409*4882a593Smuzhiyun            libtoaster.setNotification("layer-deleted", message.html());
410*4882a593Smuzhiyun            window.location.replace(data.gotoUrl);
411*4882a593Smuzhiyun          }
412*4882a593Smuzhiyun        },
413*4882a593Smuzhiyun        error: function(data) {
414*4882a593Smuzhiyun          console.warn("Call failed");
415*4882a593Smuzhiyun          console.warn(data);
416*4882a593Smuzhiyun        }
417*4882a593Smuzhiyun    });
418*4882a593Smuzhiyun  });
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun  layerDepsList.find(".glyphicon-trash").click(layerDepRemoveClick);
421*4882a593Smuzhiyun  layerDepsList.find("a").tooltip();
422*4882a593Smuzhiyun  $(".glyphicon-trash").tooltip();
423*4882a593Smuzhiyun  $(".commit").tooltip();
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun  editLayerSource.click(function() {
426*4882a593Smuzhiyun    /* Kindly bring the git layers imported from layerindex to normal page
427*4882a593Smuzhiyun     * and not this new page :(
428*4882a593Smuzhiyun     */
429*4882a593Smuzhiyun    $(this).hide();
430*4882a593Smuzhiyun    saveSourceChangesBtn.attr("disabled", "disabled");
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun    $("#git-repo-info, #directory-info").hide();
433*4882a593Smuzhiyun    $("#edit-layer-source-form").fadeIn();
434*4882a593Smuzhiyun    if ($("#layer-dir-path-in-details").val() == "") {
435*4882a593Smuzhiyun      //Local dir path is empty...
436*4882a593Smuzhiyun      $("#repo").prop("checked", true);
437*4882a593Smuzhiyun      $("#layer-git").fadeIn();
438*4882a593Smuzhiyun      $("#layer-dir").hide();
439*4882a593Smuzhiyun    } else {
440*4882a593Smuzhiyun      $("#layer-git").hide();
441*4882a593Smuzhiyun      $("#layer-dir").fadeIn();
442*4882a593Smuzhiyun    }
443*4882a593Smuzhiyun  });
444*4882a593Smuzhiyun
445*4882a593Smuzhiyun  $('input:radio[name="source-location"]').change(function() {
446*4882a593Smuzhiyun    if ($('input[name=source-location]:checked').val() == "repo") {
447*4882a593Smuzhiyun      $("#layer-git").fadeIn();
448*4882a593Smuzhiyun      $("#layer-dir").hide();
449*4882a593Smuzhiyun      if ($("#layer-git-repo-url").val().length === 0 && layerGitRefInput.val().length === 0) {
450*4882a593Smuzhiyun        saveSourceChangesBtn.attr("disabled", "disabled");
451*4882a593Smuzhiyun      }
452*4882a593Smuzhiyun    } else {
453*4882a593Smuzhiyun      $("#layer-dir").fadeIn();
454*4882a593Smuzhiyun      $("#layer-git").hide();
455*4882a593Smuzhiyun    }
456*4882a593Smuzhiyun  });
457*4882a593Smuzhiyun
458*4882a593Smuzhiyun  $("#layer-dir-path-in-details").keyup(function() {
459*4882a593Smuzhiyun    saveSourceChangesBtn.removeAttr("disabled");
460*4882a593Smuzhiyun  });
461*4882a593Smuzhiyun
462*4882a593Smuzhiyun  $("#layer-git-repo-url").keyup(function() {
463*4882a593Smuzhiyun    if ($("#layer-git-repo-url").val().length > 0 && layerGitRefInput.val().length > 0) {
464*4882a593Smuzhiyun      saveSourceChangesBtn.removeAttr("disabled");
465*4882a593Smuzhiyun    }
466*4882a593Smuzhiyun  });
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun  layerGitRefInput.keyup(function() {
469*4882a593Smuzhiyun    if ($("#layer-git-repo-url").val().length > 0 && layerGitRefInput.val().length > 0) {
470*4882a593Smuzhiyun      saveSourceChangesBtn.removeAttr("disabled");
471*4882a593Smuzhiyun    }
472*4882a593Smuzhiyun  });
473*4882a593Smuzhiyun
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun  layerSubDirInput.keyup(function(){
476*4882a593Smuzhiyun    if ($(this).val().length > 0){
477*4882a593Smuzhiyun      saveSourceChangesBtn.removeAttr("disabled");
478*4882a593Smuzhiyun    }
479*4882a593Smuzhiyun  });
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun  $('#cancel-changes-for-switch').click(function() {
482*4882a593Smuzhiyun    $("#edit-layer-source-form").hide();
483*4882a593Smuzhiyun    $("#directory-info, #git-repo-info").fadeIn();
484*4882a593Smuzhiyun    editLayerSource.show();
485*4882a593Smuzhiyun  });
486*4882a593Smuzhiyun
487*4882a593Smuzhiyun  saveSourceChangesBtn.click(function() {
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun    var layerData = {
490*4882a593Smuzhiyun      vcs_url: $('#layer-git-repo-url').val(),
491*4882a593Smuzhiyun      commit: layerGitRefInput.val(),
492*4882a593Smuzhiyun      dirpath: layerSubDirInput.val(),
493*4882a593Smuzhiyun      local_source_dir: $('#layer-dir-path-in-details').val(),
494*4882a593Smuzhiyun    };
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun    if ($('input[name=source-location]:checked').val() == "repo") {
497*4882a593Smuzhiyun      layerData.local_source_dir = "";
498*4882a593Smuzhiyun    } else {
499*4882a593Smuzhiyun      layerData.vcs_url = "";
500*4882a593Smuzhiyun      layerData.git_ref = "";
501*4882a593Smuzhiyun    }
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun    $.ajax({
504*4882a593Smuzhiyun        type: "POST",
505*4882a593Smuzhiyun        url: ctx.xhrUpdateLayerUrl,
506*4882a593Smuzhiyun        data: layerData,
507*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
508*4882a593Smuzhiyun        success: function (data) {
509*4882a593Smuzhiyun          if (data.error != "ok") {
510*4882a593Smuzhiyun            console.warn(data.error);
511*4882a593Smuzhiyun          } else {
512*4882a593Smuzhiyun            /* success layer property changed */
513*4882a593Smuzhiyun            window.location.reload();
514*4882a593Smuzhiyun          }
515*4882a593Smuzhiyun        },
516*4882a593Smuzhiyun        error: function (data) {
517*4882a593Smuzhiyun          console.warn("Call failed");
518*4882a593Smuzhiyun          console.warn(data);
519*4882a593Smuzhiyun        }
520*4882a593Smuzhiyun    });
521*4882a593Smuzhiyun  });
522*4882a593Smuzhiyun}
523