xref: /OK3568_Linux_fs/yocto/bitbake/lib/toaster/toastergui/static/js/customrecipe.js (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun"use strict";
2*4882a593Smuzhiyun
3*4882a593Smuzhiyunfunction customRecipePageInit(ctx) {
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun  var urlParams = libtoaster.parseUrlParams();
6*4882a593Smuzhiyun  var customiseTable = $("#selectpackagestable");
7*4882a593Smuzhiyun  var addPkgDepsModalBtn = $("#add-package-deps-modal-btn");
8*4882a593Smuzhiyun  var rmdPkgReverseDepsModalBtn = $("#rm-package-reverse-deps-modal-btn");
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun  if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new'){
11*4882a593Smuzhiyun    $("#image-created-notification").show();
12*4882a593Smuzhiyun  }
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun  customiseTable.on('table-done', function(e, total){
15*4882a593Smuzhiyun    /* Table is done so now setup the click handler for the package buttons */
16*4882a593Smuzhiyun    $(".add-rm-package-btn").click(function(e){
17*4882a593Smuzhiyun      e.preventDefault();
18*4882a593Smuzhiyun      var targetPkg = $(this).data();
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun       checkPackageDeps(targetPkg, function(pkgData){
21*4882a593Smuzhiyun         if (targetPkg.directive === 'add'){
22*4882a593Smuzhiyun           /* If we're adding a package we may need to show the modal to advise
23*4882a593Smuzhiyun            * on dependencies for this package.
24*4882a593Smuzhiyun            */
25*4882a593Smuzhiyun           if (pkgData.unsatisfied_dependencies.length === 0){
26*4882a593Smuzhiyun             addRemovePackage(targetPkg);
27*4882a593Smuzhiyun           } else {
28*4882a593Smuzhiyun             showPackageDepsModal(targetPkg, pkgData);
29*4882a593Smuzhiyun           }
30*4882a593Smuzhiyun         } else if (targetPkg.directive === 'remove') {
31*4882a593Smuzhiyun           if (pkgData.reverse_dependencies.length === 0){
32*4882a593Smuzhiyun             addRemovePackage(targetPkg);
33*4882a593Smuzhiyun           } else {
34*4882a593Smuzhiyun             showPackageReverseDepsModal(targetPkg, pkgData);
35*4882a593Smuzhiyun           }
36*4882a593Smuzhiyun           }
37*4882a593Smuzhiyun        });
38*4882a593Smuzhiyun    });
39*4882a593Smuzhiyun  });
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun  function checkPackageDeps(targetPkg, doneCb){
42*4882a593Smuzhiyun    $.ajax({
43*4882a593Smuzhiyun        type: 'GET',
44*4882a593Smuzhiyun        url: targetPkg.packageUrl,
45*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
46*4882a593Smuzhiyun        success: function(data){
47*4882a593Smuzhiyun          if (data.error !== 'ok'){
48*4882a593Smuzhiyun            console.warn(data.error);
49*4882a593Smuzhiyun            return;
50*4882a593Smuzhiyun          }
51*4882a593Smuzhiyun          doneCb(data);
52*4882a593Smuzhiyun        }
53*4882a593Smuzhiyun    });
54*4882a593Smuzhiyun  }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun  function showPackageDepsModal(targetPkg, pkgData){
57*4882a593Smuzhiyun    var modal = $("#package-deps-modal");
58*4882a593Smuzhiyun    var depsList = modal.find("#package-add-dep-list");
59*4882a593Smuzhiyun    var deps = pkgData.unsatisfied_dependencies;
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun    modal.find(".package-to-add-name").text(targetPkg.name);
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun    depsList.text("");
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun    for (var i in deps){
66*4882a593Smuzhiyun      var li = $('<li></li>').text(deps[i].name);
67*4882a593Smuzhiyun      li.append($('<span></span>').text(" ("+
68*4882a593Smuzhiyun            deps[i].size_formatted+")"));
69*4882a593Smuzhiyun      depsList.append(li);
70*4882a593Smuzhiyun    }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun    modal.find("#package-deps-total-size").text(
73*4882a593Smuzhiyun      pkgData.unsatisfied_dependencies_size_formatted);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun    targetPkg.depsAdded = deps;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun    addPkgDepsModalBtn.data(targetPkg);
78*4882a593Smuzhiyun    modal.modal('show');
79*4882a593Smuzhiyun  }
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun  addPkgDepsModalBtn.click(function(e){
82*4882a593Smuzhiyun    e.preventDefault();
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun    addRemovePackage($(this).data(), null);
85*4882a593Smuzhiyun  });
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun  function showPackageReverseDepsModal(targetPkg, pkgData){
88*4882a593Smuzhiyun    var modal = $("#package-reverse-deps-modal");
89*4882a593Smuzhiyun    var depsList = modal.find("#package-reverse-dep-list");
90*4882a593Smuzhiyun    var deps = pkgData.reverse_dependencies;
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun    var depsCount = deps.length;
93*4882a593Smuzhiyun    var vDepends = "depends";
94*4882a593Smuzhiyun    var vPackage = "package";
95*4882a593Smuzhiyun    var vThis = "this";
96*4882a593Smuzhiyun    if (depsCount > 1) {
97*4882a593Smuzhiyun      vDepends = "depend";
98*4882a593Smuzhiyun      vPackage = "packages";
99*4882a593Smuzhiyun      vThis = "these";
100*4882a593Smuzhiyun    }
101*4882a593Smuzhiyun    modal.find(".package-to-rm-name").text(targetPkg.name);
102*4882a593Smuzhiyun    modal.find(".reverse-deps-count").text(depsCount);
103*4882a593Smuzhiyun    modal.find(".reverse-deps-count-plus1").text((depsCount+1) + " packages");
104*4882a593Smuzhiyun    modal.find(".reverse-deps-depends").text(vDepends);
105*4882a593Smuzhiyun    modal.find(".reverse-deps-package").text(vPackage);
106*4882a593Smuzhiyun    modal.find(".reverse-deps-this").text(vThis);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun    depsList.text("");
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun    for (var i in deps){
111*4882a593Smuzhiyun      var li = $('<li></li>').text(deps[i].name);
112*4882a593Smuzhiyun      li.append($('<span></span>').text(" ("+
113*4882a593Smuzhiyun            deps[i].size_formatted+")"));
114*4882a593Smuzhiyun      depsList.append(li);
115*4882a593Smuzhiyun    }
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun    modal.find("#package-reverse-deps-total-size").text(
118*4882a593Smuzhiyun      pkgData.reverse_dependencies_size_formatted);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun    targetPkg.depsRemoved = deps;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun    rmdPkgReverseDepsModalBtn.data(targetPkg);
123*4882a593Smuzhiyun    modal.modal('show');
124*4882a593Smuzhiyun  }
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun  rmdPkgReverseDepsModalBtn.click(function(e){
127*4882a593Smuzhiyun    e.preventDefault();
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun    addRemovePackage($(this).data(), null);
130*4882a593Smuzhiyun  });
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun  function addRemovePackage(targetPkg, tableParams){
134*4882a593Smuzhiyun    var method;
135*4882a593Smuzhiyun    var msg = "You have ";
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun    var btnCell = $("#package-btn-cell-" + targetPkg.id);
138*4882a593Smuzhiyun    var inlineNotify = btnCell.children(".inline-notification");
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun    var i;
141*4882a593Smuzhiyun    var dep;
142*4882a593Smuzhiyun    var depBtnCell;
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun    if (targetPkg.directive === 'add') {
145*4882a593Smuzhiyun      method = 'PUT';
146*4882a593Smuzhiyun      /* If the package had dependencies also notify that they were added */
147*4882a593Smuzhiyun      if (targetPkg.hasOwnProperty('depsAdded') &&
148*4882a593Smuzhiyun        targetPkg.depsAdded.length > 0) {
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun        msg += "added ";
151*4882a593Smuzhiyun        msg += "<strong>" + (targetPkg.depsAdded.length + 1) + "</strong>";
152*4882a593Smuzhiyun        msg += " packages to " + ctx.recipe.name + ": ";
153*4882a593Smuzhiyun        msg += "<strong>" + targetPkg.name + "</strong> and its dependencies";
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun        for (i in targetPkg.depsAdded){
156*4882a593Smuzhiyun          dep = targetPkg.depsAdded[i];
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun          msg += " <strong>" + dep.name + "</strong>";
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun          /* Add any cells currently in view to the list of cells which get
161*4882a593Smuzhiyun           * an list-inline notification inside them and which change add/rm state
162*4882a593Smuzhiyun           */
163*4882a593Smuzhiyun          depBtnCell = $("#package-btn-cell-" + dep.pk);
164*4882a593Smuzhiyun          btnCell = btnCell.add(depBtnCell);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun          inlineNotify = inlineNotify.add(
167*4882a593Smuzhiyun            depBtnCell.children(".inline-notification"));
168*4882a593Smuzhiyun        }
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun        inlineNotify.text(
171*4882a593Smuzhiyun          (targetPkg.depsAdded.length + 1) + " packages added");
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun      } else {
174*4882a593Smuzhiyun        msg += "added <strong>1</strong>";
175*4882a593Smuzhiyun        msg += " package to " + ctx.recipe.name + ": ";
176*4882a593Smuzhiyun        msg += "<strong>" + targetPkg.name + "</strong>";
177*4882a593Smuzhiyun        inlineNotify.text("1 package added");
178*4882a593Smuzhiyun      }
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun    } else if (targetPkg.directive === 'remove') {
181*4882a593Smuzhiyun      method = 'DELETE';
182*4882a593Smuzhiyun      var numPackageString = "1 package ";
183*4882a593Smuzhiyun      var revDepList = "";
184*4882a593Smuzhiyun      if (targetPkg.hasOwnProperty('depsRemoved') &&
185*4882a593Smuzhiyun              targetPkg.depsRemoved.length > 0) {
186*4882a593Smuzhiyun        var depsRemovedLength = targetPkg.depsRemoved.length;
187*4882a593Smuzhiyun        var ending = "y: ";
188*4882a593Smuzhiyun        var maxRevDepsDisplayed  = 5;
189*4882a593Smuzhiyun        var d = 0;
190*4882a593Smuzhiyun        if (depsRemovedLength > 1) {
191*4882a593Smuzhiyun            ending = "ies: ";
192*4882a593Smuzhiyun        }
193*4882a593Smuzhiyun        numPackageString = (depsRemovedLength + 1) + " packages";
194*4882a593Smuzhiyun        revDepList = " and its " + depsRemovedLength + " reverse dependenc" + ending;
195*4882a593Smuzhiyun        for (i in targetPkg.depsRemoved){
196*4882a593Smuzhiyun          /* include up to maxRevDepsDisplayed rev deps on the page notification */
197*4882a593Smuzhiyun          var notShownCount = depsRemovedLength - maxRevDepsDisplayed;
198*4882a593Smuzhiyun          dep = targetPkg.depsRemoved[i];
199*4882a593Smuzhiyun          if (d < maxRevDepsDisplayed) {
200*4882a593Smuzhiyun            if (d > 0) {
201*4882a593Smuzhiyun                revDepList += ", ";
202*4882a593Smuzhiyun            }
203*4882a593Smuzhiyun            revDepList += dep.name;
204*4882a593Smuzhiyun            d++;
205*4882a593Smuzhiyun            if ((d === maxRevDepsDisplayed) && (notShownCount > 0)) {
206*4882a593Smuzhiyun                revDepList += " and " + notShownCount + " more";
207*4882a593Smuzhiyun            }
208*4882a593Smuzhiyun          }
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun          /* Add any cells currently in view to the list of cells which get
211*4882a593Smuzhiyun           * an list-inline notification inside them and which change add/rm state
212*4882a593Smuzhiyun           */
213*4882a593Smuzhiyun          depBtnCell = $("#package-btn-cell-" + dep.pk);
214*4882a593Smuzhiyun          btnCell = btnCell.add(depBtnCell);
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun          inlineNotify = inlineNotify.add(
217*4882a593Smuzhiyun            depBtnCell.children(".inline-notification"));
218*4882a593Smuzhiyun        }
219*4882a593Smuzhiyun      }
220*4882a593Smuzhiyun      msg+= "removed " + numPackageString + " from " + ctx.recipe.name + ":";
221*4882a593Smuzhiyun      msg += " <strong>" + targetPkg.name + "</strong>";
222*4882a593Smuzhiyun      msg += revDepList;
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun      inlineNotify.text(numPackageString + " removed");
225*4882a593Smuzhiyun    } else {
226*4882a593Smuzhiyun      throw("Unknown package directive: should be add or remove");
227*4882a593Smuzhiyun    }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun    $.ajax({
230*4882a593Smuzhiyun        type: method,
231*4882a593Smuzhiyun        url: targetPkg.packageUrl,
232*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
233*4882a593Smuzhiyun        success: function(data){
234*4882a593Smuzhiyun          if (data.error !== 'ok'){
235*4882a593Smuzhiyun            console.warn(data.error);
236*4882a593Smuzhiyun            return;
237*4882a593Smuzhiyun          }
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun          libtoaster.showChangeNotification(msg);
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun          /* do the in-cell/inline notification to swap buttoms from add to
242*4882a593Smuzhiyun           * remove
243*4882a593Smuzhiyun           */
244*4882a593Smuzhiyun          btnCell.children("button").fadeOut().promise().done(function(){
245*4882a593Smuzhiyun            inlineNotify.fadeIn().delay(500).fadeOut(function(){
246*4882a593Smuzhiyun              if (targetPkg.directive === 'add')
247*4882a593Smuzhiyun                btnCell.children("button[data-directive=remove]").fadeIn();
248*4882a593Smuzhiyun              else
249*4882a593Smuzhiyun                btnCell.children("button[data-directive=add]").fadeIn();
250*4882a593Smuzhiyun            });
251*4882a593Smuzhiyun          });
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun          /* Update the total num packages */
254*4882a593Smuzhiyun          $.ajax({
255*4882a593Smuzhiyun            type: "GET",
256*4882a593Smuzhiyun            url: ctx.recipe.xhrPackageListUrl,
257*4882a593Smuzhiyun            headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
258*4882a593Smuzhiyun            success: function(data){
259*4882a593Smuzhiyun              console.log(data);
260*4882a593Smuzhiyun              $("#total-num-packages").text(data.total);
261*4882a593Smuzhiyun              $("#total-size-packages").text(data.total_size_formatted);
262*4882a593Smuzhiyun            }
263*4882a593Smuzhiyun          });
264*4882a593Smuzhiyun        }
265*4882a593Smuzhiyun    });
266*4882a593Smuzhiyun  }
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun  $("#no-results-show-all-packages").click(function(){
269*4882a593Smuzhiyun    $(".no-results-search-input").val("");
270*4882a593Smuzhiyun  });
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun  $("#no-results-remove-search-btn").click(function(){
273*4882a593Smuzhiyun      $(".no-results-search-input").val("");
274*4882a593Smuzhiyun      $(this).hide();
275*4882a593Smuzhiyun  });
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun  /* Trigger a build of your custom image */
278*4882a593Smuzhiyun  $(".build-custom-image").click(function(){
279*4882a593Smuzhiyun    libtoaster.startABuild(null, ctx.recipe.name,
280*4882a593Smuzhiyun      function(){
281*4882a593Smuzhiyun        window.location.replace(libtoaster.ctx.projectBuildsUrl);
282*4882a593Smuzhiyun    });
283*4882a593Smuzhiyun  });
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun  $("#delete-custom-recipe-confirmed").click(function(e){
286*4882a593Smuzhiyun    e.preventDefault();
287*4882a593Smuzhiyun    libtoaster.disableAjaxLoadingTimer();
288*4882a593Smuzhiyun    $(this).find('[data-role="submit-state"]').hide();
289*4882a593Smuzhiyun    $(this).find('[data-role="loading-state"]').show();
290*4882a593Smuzhiyun    $(this).attr("disabled", "disabled");
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun    $.ajax({
293*4882a593Smuzhiyun        type: 'DELETE',
294*4882a593Smuzhiyun        url: ctx.recipe.xhrCustomRecipeUrl,
295*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
296*4882a593Smuzhiyun        success: function (data) {
297*4882a593Smuzhiyun          if (data.error !== "ok") {
298*4882a593Smuzhiyun            console.warn(data.error);
299*4882a593Smuzhiyun          } else {
300*4882a593Smuzhiyun            var msg = $('<span>You have deleted <strong>1</strong> custom image: <strong id="deleted-custom-image-name"></strong></span>');
301*4882a593Smuzhiyun            msg.find("#deleted-custom-image-name").text(ctx.recipe.name);
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun            libtoaster.setNotification("custom-image-recipe-deleted",
304*4882a593Smuzhiyun                                       msg.html());
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun            window.location.replace(data.gotoUrl);
307*4882a593Smuzhiyun          }
308*4882a593Smuzhiyun        },
309*4882a593Smuzhiyun        error: function (data) {
310*4882a593Smuzhiyun          console.warn(data);
311*4882a593Smuzhiyun        }
312*4882a593Smuzhiyun    });
313*4882a593Smuzhiyun  });
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun /* Stop the download link from working if it is in disabled state
316*4882a593Smuzhiyun  * http://getbootstrap.com/css/#forms-disabled-fieldsets
317*4882a593Smuzhiyun  */
318*4882a593Smuzhiyun $("a[disabled=disabled]").click(function(e){
319*4882a593Smuzhiyun   e.preventDefault();
320*4882a593Smuzhiyun });
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun}
323