xref: /OK3568_Linux_fs/yocto/bitbake/lib/toaster/toastergui/static/js/projectpage.js (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun"use strict";
2*4882a593Smuzhiyun
3*4882a593Smuzhiyunfunction projectPageInit(ctx) {
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun  var layerAddInput = $("#layer-add-input");
6*4882a593Smuzhiyun  var layersInPrjList = $("#layers-in-project-list");
7*4882a593Smuzhiyun  var layerAddBtn = $("#add-layer-btn");
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun  var machineChangeInput = $("#machine-change-input");
10*4882a593Smuzhiyun  var machineChangeBtn = $("#machine-change-btn");
11*4882a593Smuzhiyun  var machineForm = $("#select-machine-form");
12*4882a593Smuzhiyun  var machineChangeFormToggle = $("#change-machine-toggle");
13*4882a593Smuzhiyun  var machineNameTitle = $("#project-machine-name");
14*4882a593Smuzhiyun  var machineChangeCancel = $("#cancel-machine-change");
15*4882a593Smuzhiyun  var machineInputForm = $("#machine-input-form");
16*4882a593Smuzhiyun  var invalidMachineNameHelp = $("#invalid-machine-name-help");
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun  var distroChangeInput = $("#distro-change-input");
19*4882a593Smuzhiyun  var distroChangeBtn = $("#distro-change-btn");
20*4882a593Smuzhiyun  var distroForm = $("#select-distro-form");
21*4882a593Smuzhiyun  var distroChangeFormToggle = $("#change-distro-toggle");
22*4882a593Smuzhiyun  var distroNameTitle = $("#project-distro-name");
23*4882a593Smuzhiyun  var distroChangeCancel = $("#cancel-distro-change");
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun  var freqBuildBtn =  $("#freq-build-btn");
26*4882a593Smuzhiyun  var freqBuildList = $("#freq-build-list");
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun  var releaseChangeFormToggle = $("#release-change-toggle");
29*4882a593Smuzhiyun  var releaseTitle = $("#project-release-title");
30*4882a593Smuzhiyun  var releaseForm = $("#change-release-form");
31*4882a593Smuzhiyun  var releaseModal = $("#change-release-modal");
32*4882a593Smuzhiyun  var cancelReleaseChange = $("#cancel-release-change");
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun  var currentLayerAddSelection;
35*4882a593Smuzhiyun  var currentMachineAddSelection = "";
36*4882a593Smuzhiyun  var currentDistroAddSelection = "";
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun  var urlParams = libtoaster.parseUrlParams();
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun  libtoaster.getProjectInfo(libtoaster.ctx.xhrProjectUrl, function(prjInfo){
41*4882a593Smuzhiyun    updateProjectLayers(prjInfo.layers);
42*4882a593Smuzhiyun    updateFreqBuildRecipes(prjInfo.freqtargets);
43*4882a593Smuzhiyun    updateProjectRelease(prjInfo.release);
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun    /* If we're receiving a machine set from the url and it's different from
46*4882a593Smuzhiyun     * our current machine then activate set machine sequence.
47*4882a593Smuzhiyun     */
48*4882a593Smuzhiyun    if (urlParams.hasOwnProperty('setMachine') &&
49*4882a593Smuzhiyun        urlParams.setMachine !== prjInfo.machine.name){
50*4882a593Smuzhiyun        machineChangeInput.val(urlParams.setMachine);
51*4882a593Smuzhiyun        machineChangeBtn.click();
52*4882a593Smuzhiyun    } else {
53*4882a593Smuzhiyun      updateMachineName(prjInfo.machine.name);
54*4882a593Smuzhiyun    }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun    /* If we're receiving a distro set from the url and it's different from
57*4882a593Smuzhiyun     * our current distro then activate set machine sequence.
58*4882a593Smuzhiyun     */
59*4882a593Smuzhiyun    if (urlParams.hasOwnProperty('setDistro') &&
60*4882a593Smuzhiyun        urlParams.setDistro !== prjInfo.distro.name){
61*4882a593Smuzhiyun        distroChangeInput.val(urlParams.setDistro);
62*4882a593Smuzhiyun        distroChangeBtn.click();
63*4882a593Smuzhiyun    } else {
64*4882a593Smuzhiyun      updateDistroName(prjInfo.distro.name);
65*4882a593Smuzhiyun    }
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun   /* Now we're really ready show the page */
68*4882a593Smuzhiyun    $("#project-page").show();
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun    /* Set the project name in the delete modal */
71*4882a593Smuzhiyun    $("#delete-project-modal .project-name").text(prjInfo.name);
72*4882a593Smuzhiyun  });
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun  if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new-project'){
75*4882a593Smuzhiyun    $("#project-created-notification").show();
76*4882a593Smuzhiyun  }
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun  /* Add/Rm layer functionality */
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun  libtoaster.makeTypeahead(layerAddInput, libtoaster.ctx.layersTypeAheadUrl, { include_added: "false" }, function(item){
81*4882a593Smuzhiyun    currentLayerAddSelection = item;
82*4882a593Smuzhiyun    layerAddBtn.removeAttr("disabled");
83*4882a593Smuzhiyun  });
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun  layerAddInput.keyup(function() {
86*4882a593Smuzhiyun    if ($(this).val().length == 0) {
87*4882a593Smuzhiyun      layerAddBtn.attr("disabled", "disabled")
88*4882a593Smuzhiyun    }
89*4882a593Smuzhiyun  });
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun  layerAddBtn.click(function(e){
92*4882a593Smuzhiyun    e.preventDefault();
93*4882a593Smuzhiyun    var layerObj = currentLayerAddSelection;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun    addRmLayer(layerObj, true);
96*4882a593Smuzhiyun    /* Reset the text input */
97*4882a593Smuzhiyun    layerAddInput.val("");
98*4882a593Smuzhiyun    /* Disable the add layer button*/
99*4882a593Smuzhiyun    layerAddBtn.attr("disabled", "disabled");
100*4882a593Smuzhiyun  });
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun  function addRmLayer(layerObj, add){
103*4882a593Smuzhiyun
104*4882a593Smuzhiyun    libtoaster.addRmLayer(layerObj, add, function(layerDepsList){
105*4882a593Smuzhiyun      if (add){
106*4882a593Smuzhiyun        updateProjectLayers([layerObj]);
107*4882a593Smuzhiyun        updateProjectLayers(layerDepsList);
108*4882a593Smuzhiyun      }
109*4882a593Smuzhiyun
110*4882a593Smuzhiyun      /* Show the alert message */
111*4882a593Smuzhiyun      var message = libtoaster.makeLayerAddRmAlertMsg(layerObj, layerDepsList, add);
112*4882a593Smuzhiyun      libtoaster.showChangeNotification(message);
113*4882a593Smuzhiyun    });
114*4882a593Smuzhiyun  }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun  function updateProjectLayers(layers){
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun    /* No layers to add */
119*4882a593Smuzhiyun    if (layers.length === 0){
120*4882a593Smuzhiyun      updateLayersCount();
121*4882a593Smuzhiyun      return;
122*4882a593Smuzhiyun    }
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun    for (var i in layers){
125*4882a593Smuzhiyun      var layerObj = layers[i];
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun      var projectLayer = $("<li><a></a><span class=\"glyphicon glyphicon-trash\" data-toggle=\"tooltip\" title=\"Remove\"></span></li>");
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun      projectLayer.data('layer', layerObj);
130*4882a593Smuzhiyun      projectLayer.children("span").tooltip();
131*4882a593Smuzhiyun
132*4882a593Smuzhiyun      var link = projectLayer.children("a");
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun      link.attr("href", layerObj.layerdetailurl);
135*4882a593Smuzhiyun      link.text(layerObj.name);
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun      if (layerObj.local_source_dir) {
138*4882a593Smuzhiyun        link.tooltip({title: layerObj.local_source_dir, placement: "right"});
139*4882a593Smuzhiyun      } else {
140*4882a593Smuzhiyun        link.tooltip({title: layerObj.vcs_url + " | "+ layerObj.vcs_reference, placement: "right"});
141*4882a593Smuzhiyun      }
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun      var trashItem = projectLayer.children("span");
144*4882a593Smuzhiyun      trashItem.click(function (e) {
145*4882a593Smuzhiyun        e.preventDefault();
146*4882a593Smuzhiyun        var layerObjToRm = $(this).parent().data('layer');
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun        addRmLayer(layerObjToRm, false);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun        $(this).parent().fadeOut(function (){
151*4882a593Smuzhiyun          $(this).remove();
152*4882a593Smuzhiyun          updateLayersCount();
153*4882a593Smuzhiyun        });
154*4882a593Smuzhiyun      });
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun      layersInPrjList.append(projectLayer);
157*4882a593Smuzhiyun
158*4882a593Smuzhiyun      updateLayersCount();
159*4882a593Smuzhiyun    }
160*4882a593Smuzhiyun  }
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun  function updateLayersCount(){
163*4882a593Smuzhiyun    var count = $("#layers-in-project-list").children().length;
164*4882a593Smuzhiyun    var noLayerMsg = $("#no-layers-in-project");
165*4882a593Smuzhiyun    var buildInput = $("#build-input");
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun    if (count === 0) {
169*4882a593Smuzhiyun      noLayerMsg.fadeIn();
170*4882a593Smuzhiyun      $("#no-layers-in-project").fadeIn();
171*4882a593Smuzhiyun      buildInput.attr("disabled", "disabled");
172*4882a593Smuzhiyun    } else {
173*4882a593Smuzhiyun      noLayerMsg.hide();
174*4882a593Smuzhiyun      buildInput.removeAttr("disabled");
175*4882a593Smuzhiyun    }
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun    $("#project-layers-count").text(count);
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun    return count;
180*4882a593Smuzhiyun  }
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun  /* Frequent builds functionality */
183*4882a593Smuzhiyun  function updateFreqBuildRecipes(recipes) {
184*4882a593Smuzhiyun    var noMostBuilt = $("#no-most-built");
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun    if (recipes.length === 0){
187*4882a593Smuzhiyun      noMostBuilt.show();
188*4882a593Smuzhiyun      freqBuildBtn.hide();
189*4882a593Smuzhiyun    } else {
190*4882a593Smuzhiyun      noMostBuilt.hide();
191*4882a593Smuzhiyun      freqBuildBtn.show();
192*4882a593Smuzhiyun    }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun    for (var i in recipes){
195*4882a593Smuzhiyun      var freqTargetCheck = $('<li><div class="checkbox"><label><input type="checkbox" /><span class="freq-target-name"></span></label></li>');
196*4882a593Smuzhiyun      freqTargetCheck.find(".freq-target-name").text(recipes[i]);
197*4882a593Smuzhiyun      freqTargetCheck.find("input").val(recipes[i]);
198*4882a593Smuzhiyun      freqTargetCheck.click(function(){
199*4882a593Smuzhiyun        if (freqBuildList.find(":checked").length > 0)
200*4882a593Smuzhiyun          freqBuildBtn.removeAttr("disabled");
201*4882a593Smuzhiyun        else
202*4882a593Smuzhiyun          freqBuildBtn.attr("disabled", "disabled");
203*4882a593Smuzhiyun      });
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun      freqBuildList.append(freqTargetCheck);
206*4882a593Smuzhiyun    }
207*4882a593Smuzhiyun  }
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun  freqBuildBtn.click(function(e){
210*4882a593Smuzhiyun    e.preventDefault();
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun    var toBuild = "";
213*4882a593Smuzhiyun    freqBuildList.find(":checked").each(function(){
214*4882a593Smuzhiyun      toBuild += $(this).val() + ' ';
215*4882a593Smuzhiyun    });
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun    toBuild = toBuild.trim();
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun    libtoaster.startABuild(null, toBuild,
220*4882a593Smuzhiyun      function(){
221*4882a593Smuzhiyun        /* Build request started */
222*4882a593Smuzhiyun        window.location.replace(libtoaster.ctx.projectBuildsUrl);
223*4882a593Smuzhiyun      },
224*4882a593Smuzhiyun      function(){
225*4882a593Smuzhiyun        /* Build request failed */
226*4882a593Smuzhiyun        console.warn("Build request failed to be created");
227*4882a593Smuzhiyun    });
228*4882a593Smuzhiyun  });
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun  /* Change machine functionality */
232*4882a593Smuzhiyun  machineChangeInput.keyup(function(){
233*4882a593Smuzhiyun    if ($(this).val().indexOf(' ') >= 0) {
234*4882a593Smuzhiyun        machineChangeBtn.attr("disabled", "disabled");
235*4882a593Smuzhiyun        invalidMachineNameHelp.show();
236*4882a593Smuzhiyun        machineInputForm.addClass('has-error');
237*4882a593Smuzhiyun    } else {
238*4882a593Smuzhiyun        machineChangeBtn.removeAttr("disabled");
239*4882a593Smuzhiyun        invalidMachineNameHelp.hide();
240*4882a593Smuzhiyun        machineInputForm.removeClass('has-error');
241*4882a593Smuzhiyun    }
242*4882a593Smuzhiyun  });
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun  machineChangeFormToggle.click(function(){
245*4882a593Smuzhiyun    machineChangeInput.val(machineNameTitle.text());
246*4882a593Smuzhiyun    machineChangeBtn.removeAttr("disabled");
247*4882a593Smuzhiyun    invalidMachineNameHelp.hide();
248*4882a593Smuzhiyun    machineInputForm.removeClass('has-error');
249*4882a593Smuzhiyun    machineForm.slideDown();
250*4882a593Smuzhiyun    machineNameTitle.hide();
251*4882a593Smuzhiyun    $(this).hide();
252*4882a593Smuzhiyun  });
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun  machineChangeCancel.click(function(){
255*4882a593Smuzhiyun    machineForm.slideUp(function(){
256*4882a593Smuzhiyun      machineNameTitle.show();
257*4882a593Smuzhiyun      machineChangeFormToggle.show();
258*4882a593Smuzhiyun    });
259*4882a593Smuzhiyun  });
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun  function updateMachineName(machineName){
262*4882a593Smuzhiyun    machineChangeInput.val(machineName);
263*4882a593Smuzhiyun    machineNameTitle.text(machineName);
264*4882a593Smuzhiyun  }
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun  libtoaster.makeTypeahead(machineChangeInput,
267*4882a593Smuzhiyun                           libtoaster.ctx.machinesTypeAheadUrl,
268*4882a593Smuzhiyun                           { }, function(item){
269*4882a593Smuzhiyun    currentMachineAddSelection = item.name;
270*4882a593Smuzhiyun    machineChangeBtn.removeAttr("disabled");
271*4882a593Smuzhiyun  });
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun  machineChangeBtn.click(function(e){
274*4882a593Smuzhiyun    e.preventDefault();
275*4882a593Smuzhiyun    /* We accept any value regardless of typeahead selection or not */
276*4882a593Smuzhiyun    if (machineChangeInput.val().length === 0)
277*4882a593Smuzhiyun      return;
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun    currentMachineAddSelection = machineChangeInput.val();
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun    libtoaster.editCurrentProject(
282*4882a593Smuzhiyun      { machineName : currentMachineAddSelection },
283*4882a593Smuzhiyun      function(){
284*4882a593Smuzhiyun        /* Success machine changed */
285*4882a593Smuzhiyun        updateMachineName(currentMachineAddSelection);
286*4882a593Smuzhiyun        machineChangeCancel.click();
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun        /* Show the alert message */
289*4882a593Smuzhiyun        var message = $('<span>You have changed the machine to: <strong><span id="notify-machine-name"></span></strong></span>');
290*4882a593Smuzhiyun        message.find("#notify-machine-name").text(currentMachineAddSelection);
291*4882a593Smuzhiyun        libtoaster.showChangeNotification(message);
292*4882a593Smuzhiyun    },
293*4882a593Smuzhiyun      function(){
294*4882a593Smuzhiyun        /* Failed machine changed */
295*4882a593Smuzhiyun        console.warn("Failed to change machine");
296*4882a593Smuzhiyun    });
297*4882a593Smuzhiyun  });
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun  /* Change distro functionality */
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun  distroChangeFormToggle.click(function(){
303*4882a593Smuzhiyun    distroForm.slideDown();
304*4882a593Smuzhiyun    distroNameTitle.hide();
305*4882a593Smuzhiyun    $(this).hide();
306*4882a593Smuzhiyun  });
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun  distroChangeCancel.click(function(){
309*4882a593Smuzhiyun    distroForm.slideUp(function(){
310*4882a593Smuzhiyun      distroNameTitle.show();
311*4882a593Smuzhiyun      distroChangeFormToggle.show();
312*4882a593Smuzhiyun    });
313*4882a593Smuzhiyun  });
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun  function updateDistroName(distroName){
316*4882a593Smuzhiyun    distroChangeInput.val(distroName);
317*4882a593Smuzhiyun    distroNameTitle.text(distroName);
318*4882a593Smuzhiyun  }
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun  libtoaster.makeTypeahead(distroChangeInput,
321*4882a593Smuzhiyun                           libtoaster.ctx.distrosTypeAheadUrl,
322*4882a593Smuzhiyun                           { }, function(item){
323*4882a593Smuzhiyun    currentDistroAddSelection = item.name;
324*4882a593Smuzhiyun    distroChangeBtn.removeAttr("disabled");
325*4882a593Smuzhiyun  });
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun  distroChangeBtn.click(function(e){
328*4882a593Smuzhiyun    e.preventDefault();
329*4882a593Smuzhiyun    /* We accept any value regardless of typeahead selection or not */
330*4882a593Smuzhiyun    if (distroChangeInput.val().length === 0)
331*4882a593Smuzhiyun      return;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun    currentDistroAddSelection = distroChangeInput.val();
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun    libtoaster.editCurrentProject(
336*4882a593Smuzhiyun      { distroName : currentDistroAddSelection },
337*4882a593Smuzhiyun      function(){
338*4882a593Smuzhiyun        /* Success machine changed */
339*4882a593Smuzhiyun        updateDistroName(currentDistroAddSelection);
340*4882a593Smuzhiyun        distroChangeCancel.click();
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun        /* Show the alert message */
343*4882a593Smuzhiyun        var message = $('<span>You have changed the distro to: <strong><span id="notify-machine-name"></span></strong></span>');
344*4882a593Smuzhiyun        message.find("#notify-machine-name").text(currentDistroAddSelection);
345*4882a593Smuzhiyun        libtoaster.showChangeNotification(message);
346*4882a593Smuzhiyun    },
347*4882a593Smuzhiyun      function(){
348*4882a593Smuzhiyun        /* Failed machine changed */
349*4882a593Smuzhiyun        console.warn("Failed to change distro");
350*4882a593Smuzhiyun    });
351*4882a593Smuzhiyun  });
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun  /* Change release functionality */
355*4882a593Smuzhiyun  function updateProjectRelease(release){
356*4882a593Smuzhiyun    releaseTitle.text(release.description);
357*4882a593Smuzhiyun  }
358*4882a593Smuzhiyun
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun  $("#delete-project-confirmed").click(function(e){
361*4882a593Smuzhiyun    e.preventDefault();
362*4882a593Smuzhiyun    libtoaster.disableAjaxLoadingTimer();
363*4882a593Smuzhiyun    $(this).find('[data-role="submit-state"]').hide();
364*4882a593Smuzhiyun    $(this).find('[data-role="loading-state"]').show();
365*4882a593Smuzhiyun    $(this).attr("disabled", "disabled");
366*4882a593Smuzhiyun    $('#delete-project-modal [data-dismiss="modal"]').hide();
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun    $.ajax({
369*4882a593Smuzhiyun        type: 'DELETE',
370*4882a593Smuzhiyun        url: libtoaster.ctx.xhrProjectUrl,
371*4882a593Smuzhiyun        headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
372*4882a593Smuzhiyun        success: function (data) {
373*4882a593Smuzhiyun          if (data.error !== "ok") {
374*4882a593Smuzhiyun            console.warn(data.error);
375*4882a593Smuzhiyun          } else {
376*4882a593Smuzhiyun            var msg =  $('<span>You have deleted <strong>1</strong> project: <strong id="project-deleted"></strong></span>');
377*4882a593Smuzhiyun
378*4882a593Smuzhiyun            msg.find("#project-deleted").text(libtoaster.ctx.projectName);
379*4882a593Smuzhiyun            libtoaster.setNotification("project-deleted", msg.html());
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun            window.location.replace(data.gotoUrl);
382*4882a593Smuzhiyun          }
383*4882a593Smuzhiyun        },
384*4882a593Smuzhiyun        error: function (data) {
385*4882a593Smuzhiyun          console.warn(data);
386*4882a593Smuzhiyun        }
387*4882a593Smuzhiyun    });
388*4882a593Smuzhiyun  });
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun}
391