選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

194 行
4.3 KiB

  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. // My HTTP Request
  4. frappe.provide('frappe.request');
  5. frappe.request.url = '/';
  6. // generic server call (call page, object)
  7. frappe.call = function(opts) {
  8. var args = $.extend({}, opts.args);
  9. // cmd
  10. if(opts.module && opts.page) {
  11. args.cmd = opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method;
  12. } else if(opts.doc) {
  13. $.extend(args, {
  14. cmd: "runserverobj",
  15. docs: frappe.model.get_doc(opts.doc.doctype, opts.doc.name),
  16. method: opts.method,
  17. args: opts.args,
  18. });
  19. } else if(opts.method) {
  20. args.cmd = opts.method;
  21. }
  22. // stringify args if required
  23. for(key in args) {
  24. if(args[key] && typeof args[key] != 'string') {
  25. args[key] = JSON.stringify(args[key]);
  26. }
  27. }
  28. return frappe.request.call({
  29. type: opts.type || "POST",
  30. args: args,
  31. success: opts.callback,
  32. error: opts.error,
  33. btn: opts.btn,
  34. freeze: opts.freeze,
  35. show_spinner: !opts.no_spinner,
  36. progress_bar: opts.progress_bar,
  37. async: opts.async
  38. });
  39. }
  40. frappe.request.call = function(opts) {
  41. frappe.request.prepare(opts);
  42. // all requests will be post, set _type as POST for commit
  43. opts.args._type = opts.type;
  44. var ajax_args = {
  45. url: opts.url || frappe.request.url,
  46. data: opts.args,
  47. type: 'POST',
  48. dataType: opts.dataType || 'json',
  49. statusCode: {
  50. 404: function(xhr) {
  51. msgprint("Not Found");
  52. },
  53. 403: function(xhr) {
  54. msgprint("Not Permitted");
  55. },
  56. 200: function(data, xhr) {
  57. opts.success && opts.success(data, xhr.responseText);
  58. }
  59. },
  60. async: opts.async
  61. };
  62. frappe.last_request = ajax_args.data;
  63. if(opts.progress_bar) {
  64. var interval = null;
  65. $.extend(ajax_args, {
  66. xhr: function() {
  67. var xhr = jQuery.ajaxSettings.xhr();
  68. interval = setInterval(function() {
  69. if(xhr.readyState > 2) {
  70. var total = parseInt(xhr.getResponseHeader('Original-Length') || 0) ||
  71. parseInt(xhr.getResponseHeader('Content-Length'));
  72. var completed = parseInt(xhr.responseText.length);
  73. var percent = (100.0 / total * completed).toFixed(2);
  74. opts.progress_bar.css('width', (percent < 10 ? 10 : percent) + '%');
  75. }
  76. }, 50);
  77. frappe.last_xhr = xhr;
  78. return xhr;
  79. },
  80. complete: function() {
  81. opts.progress_bar.css('width', '100%');
  82. clearInterval(interval);
  83. }
  84. })
  85. }
  86. return $.ajax(ajax_args)
  87. .fail(function(xhr, textStatus) {
  88. opts.error && opts.error(xhr)
  89. })
  90. .always(function(data) {
  91. if(data.responseText) {
  92. data = JSON.parse(data.responseText);
  93. }
  94. frappe.request.cleanup(opts, data);
  95. });
  96. }
  97. // call execute serverside request
  98. frappe.request.prepare = function(opts) {
  99. // btn indicator
  100. if(opts.btn) $(opts.btn).set_working();
  101. // navbar indicator
  102. if(opts.show_spinner) frappe.set_loading();
  103. // freeze page
  104. if(opts.freeze) frappe.dom.freeze();
  105. // no cmd?
  106. if(!opts.args.cmd) {
  107. console.log(opts)
  108. throw "Incomplete Request";
  109. }
  110. }
  111. frappe.request.cleanup = function(opts, r) {
  112. // stop button indicator
  113. if(opts.btn) $(opts.btn).done_working();
  114. // hide button indicator
  115. if(opts.show_spinner) frappe.done_loading();
  116. // un-freeze page
  117. if(opts.freeze) frappe.dom.unfreeze();
  118. // session expired? - Guest has no business here!
  119. if(r.session_expired || frappe.get_cookie("sid")==="Guest") {
  120. if(!frappe.app.logged_out) {
  121. msgprint(frappe._('Session Expired. Logging you out'));
  122. frappe.app.logout();
  123. }
  124. return;
  125. }
  126. // show messages
  127. if(r._server_messages) {
  128. r._server_messages = JSON.parse(r._server_messages)
  129. msgprint(r._server_messages);
  130. }
  131. // show errors
  132. if(r.exc) {
  133. r.exc = JSON.parse(r.exc);
  134. if(r.exc instanceof Array) {
  135. $.each(r.exc, function(i, v) {
  136. if(v)console.log(v);
  137. })
  138. } else {
  139. console.log(r.exc);
  140. }
  141. };
  142. // debug messages
  143. if(r._debug_messages) {
  144. console.log("-")
  145. console.log("-")
  146. console.log("-")
  147. if(opts.args) {
  148. console.log("<<<< arguments ");
  149. console.log(opts.args);
  150. console.log(">>>>")
  151. }
  152. $.each(JSON.parse(r._debug_messages), function(i, v) { console.log(v); });
  153. console.log("<<<< response");
  154. delete r._debug_messages;
  155. console.log(r);
  156. console.log(">>>>")
  157. console.log("-")
  158. console.log("-")
  159. console.log("-")
  160. }
  161. if(r.docs || r.docinfo) {
  162. r.docs = frappe.model.sync(r);
  163. }
  164. if(r.__messages) {
  165. $.extend(frappe._messages, r.__messages);
  166. }
  167. frappe.last_response = r;
  168. }