abp.jquery.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. var abp = abp || {};
  2. (function ($) {
  3. if (!$) {
  4. return;
  5. }
  6. /* JQUERY ENHANCEMENTS ***************************************************/
  7. // abp.ajax -> uses $.ajax ------------------------------------------------
  8. abp.ajax = function (userOptions) {
  9. userOptions = userOptions || {};
  10. var options = $.extend(true, {}, abp.ajax.defaultOpts, userOptions);
  11. var oldBeforeSendOption = options.beforeSend;
  12. options.beforeSend = function(xhr) {
  13. abp.ajax.blockUI(options);
  14. if (oldBeforeSendOption) {
  15. oldBeforeSendOption(xhr);
  16. }
  17. xhr.setRequestHeader("Pragma", "no-cache");
  18. xhr.setRequestHeader("Cache-Control", "no-cache");
  19. xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT");
  20. };
  21. options.success = undefined;
  22. options.error = undefined;
  23. return $.Deferred(function ($dfd) {
  24. $.ajax(options)
  25. .done(function (data, textStatus, jqXhr) {
  26. abp.ajax.unblockUI(options);
  27. if (data.__abp) {
  28. abp.ajax.handleResponse(data, userOptions, $dfd, jqXhr);
  29. } else {
  30. $dfd.resolve(data);
  31. userOptions.success && userOptions.success(data);
  32. }
  33. }).fail(function (jqXhr) {
  34. abp.ajax.unblockUI(options);
  35. if (jqXhr.responseJSON && jqXhr.responseJSON.__abp) {
  36. abp.ajax.handleResponse(jqXhr.responseJSON, userOptions, $dfd, jqXhr);
  37. } else {
  38. abp.ajax.handleNonAbpErrorResponse(jqXhr, userOptions, $dfd);
  39. }
  40. });
  41. });
  42. };
  43. $.extend(abp.ajax, {
  44. defaultOpts: {
  45. dataType: 'json',
  46. type: 'POST',
  47. contentType: 'application/json',
  48. headers: {
  49. 'X-Requested-With': 'XMLHttpRequest'
  50. }
  51. },
  52. defaultError: {
  53. Message: 'An error has occurred!',
  54. Details: 'Error detail not sent by server.'
  55. },
  56. defaultError401: {
  57. Message: 'You are not authenticated!',
  58. Details: 'You should be authenticated (sign in) in order to perform this operation.'
  59. },
  60. defaultError403: {
  61. Message: 'You are not authorized!',
  62. Details: 'You are not allowed to perform this operation.'
  63. },
  64. defaultError404: {
  65. Message: 'Resource not found!',
  66. Details: 'The resource requested could not found on the server.'
  67. },
  68. logError: function (error) {
  69. abp.log.error(error);
  70. },
  71. showError: function (error) {
  72. if (error.details) {
  73. return abp.message.error(error.details, error.message);
  74. } else {
  75. if (error.message&&error.message.indexOf("登陆超时") >= 0) {
  76. return abp.message.error(error.message).done(function() {
  77. top.location.reload();
  78. });
  79. } else {
  80. return abp.message.error(error.message || abp.ajax.defaultError.message);
  81. }
  82. }
  83. },
  84. handleTargetUrl: function (targetUrl) {
  85. if (!targetUrl) {
  86. location.href = abp.appPath;
  87. } else {
  88. location.href = targetUrl;
  89. }
  90. },
  91. handleNonAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
  92. if (userOptions.abpHandleError !== false) {
  93. switch (jqXHR.status) {
  94. case 401:
  95. abp.ajax.handleUnAuthorizedRequest(
  96. abp.ajax.showError(abp.ajax.defaultError401),
  97. abp.appPath
  98. );
  99. break;
  100. case 403:
  101. abp.ajax.showError(abp.ajax.defaultError403);
  102. break;
  103. case 404:
  104. abp.ajax.showError(abp.ajax.defaultError404);
  105. break;
  106. default:
  107. abp.ajax.showError(abp.ajax.defaultError);
  108. break;
  109. }
  110. }
  111. $dfd.reject.apply(this, arguments);
  112. userOptions.error && userOptions.error.apply(this, arguments);
  113. },
  114. handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
  115. if (messagePromise) {
  116. messagePromise.done(function () {
  117. abp.ajax.handleTargetUrl(targetUrl);
  118. });
  119. } else {
  120. abp.ajax.handleTargetUrl(targetUrl);
  121. }
  122. },
  123. handleResponse: function (data, userOptions, $dfd, jqXHR) {
  124. if (data) {
  125. if (data.success === true) {
  126. $dfd && $dfd.resolve(data.result, data, jqXHR);
  127. userOptions.success && userOptions.success(data.result, data, jqXHR);
  128. if (data.targetUrl) {
  129. abp.ajax.handleTargetUrl(data.targetUrl);
  130. }
  131. } else if (data.success === false) {
  132. var messagePromise = null;
  133. if (data.error) {
  134. if (userOptions.abpHandleError !== false) {
  135. messagePromise = abp.ajax.showError(data.error);
  136. }
  137. } else {
  138. data.error = abp.ajax.defaultError;
  139. }
  140. abp.ajax.logError(data.error);
  141. $dfd && $dfd.reject(data.error, jqXHR);
  142. userOptions.error && userOptions.error(data.error, jqXHR);
  143. if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
  144. abp.ajax.handleUnAuthorizedRequest(messagePromise, data.targetUrl);
  145. }
  146. } else { //not wrapped result
  147. $dfd && $dfd.resolve(data, null, jqXHR);
  148. userOptions.success && userOptions.success(data, null, jqXHR);
  149. }
  150. } else { //no data sent to back
  151. $dfd && $dfd.resolve(jqXHR);
  152. userOptions.success && userOptions.success(jqXHR);
  153. }
  154. },
  155. blockUI: function (options) {
  156. if (options.blockUI) {
  157. if (options.blockUI === true) { //block whole page
  158. abp.ui.setBusy();
  159. } else { //block an element
  160. abp.ui.setBusy(options.blockUI);
  161. }
  162. }
  163. },
  164. unblockUI: function (options) {
  165. if (options.blockUI) {
  166. if (options.blockUI === true) { //unblock whole page
  167. abp.ui.clearBusy();
  168. } else { //unblock an element
  169. abp.ui.clearBusy(options.blockUI);
  170. }
  171. }
  172. },
  173. ajaxSendHandler: function (event, request, settings) {
  174. var token = abp.security.antiForgery.getToken();
  175. if (!token) {
  176. return;
  177. }
  178. if (!abp.security.antiForgery.shouldSendToken(settings)) {
  179. return;
  180. }
  181. if (!settings.headers || settings.headers[abp.security.antiForgery.tokenHeaderName] === undefined) {
  182. request.setRequestHeader(abp.security.antiForgery.tokenHeaderName, token);
  183. }
  184. },
  185. lowerJsonKey:function (jsonObj) {
  186. if(jsonObj=== undefined || jsonObj === null) {
  187. return [];
  188. }
  189. if (jsonObj.length !== undefined) {
  190. for (var i = 0; i < jsonObj.length; i++) {
  191. lowerJsonKeyChild(jsonObj[i]);
  192. }
  193. } else {
  194. lowerJsonKeyChild(jsonObj);
  195. }
  196. return jsonObj;
  197. },
  198. lowerJsonKeyChild :function (jsonObj) {
  199. for (var k in jsonObj) {
  200. if (jsonObj.hasOwnProperty(k)) {
  201. var obj = jsonObj[k];
  202. if (typeof (obj) === "object" && (Object.prototype.toString.call(obj).toLowerCase() === "[object object]" || Object.prototype.toString.call(obj).toLowerCase() === '[object array]')) {
  203. jsonObj[k.substring(0, 1).toLowerCase() + k.substring(1)] = lowerJsonKey(obj);
  204. delete (jsonObj[k]);
  205. } else {
  206. jsonObj[k.substring(0, 1).toLowerCase() + k.substring(1)] = jsonObj[k];
  207. delete (jsonObj[k]);
  208. }
  209. }
  210. }
  211. return jsonObj;
  212. }
  213. });
  214. $(document).ajaxSend(function (event, request, settings) {
  215. return abp.ajax.ajaxSendHandler(event, request, settings);
  216. });
  217. /* JQUERY PLUGIN ENHANCEMENTS ********************************************/
  218. /* jQuery Form Plugin
  219. * http://www.malsup.com/jquery/form/
  220. */
  221. // abpAjaxForm -> uses ajaxForm ------------------------------------------
  222. if ($.fn.ajaxForm) {
  223. $.fn.abpAjaxForm = function (userOptions) {
  224. userOptions = userOptions || {};
  225. var options = $.extend({}, $.fn.abpAjaxForm.defaults, userOptions);
  226. options.beforeSubmit = function () {
  227. abp.ajax.blockUI(options);
  228. userOptions.beforeSubmit && userOptions.beforeSubmit.apply(this, arguments);
  229. };
  230. options.success = function (data) {
  231. abp.ajax.handleResponse(data, userOptions);
  232. };
  233. //TODO: Error?
  234. options.complete = function () {
  235. abp.ajax.unblockUI(options);
  236. userOptions.complete && userOptions.complete.apply(this, arguments);
  237. };
  238. return this.ajaxForm(options);
  239. };
  240. $.fn.abpAjaxForm.defaults = {
  241. method: 'POST'
  242. };
  243. }
  244. abp.event.on('abp.dynamicScriptsInitialized', function () {
  245. abp.ajax.defaultError.Message = abp.localization.abpWeb('DefaultError');
  246. abp.ajax.defaultError.Details = abp.localization.abpWeb('DefaultErrorDetail');
  247. abp.ajax.defaultError401.Message = abp.localization.abpWeb('DefaultError401');
  248. abp.ajax.defaultError401.Details = abp.localization.abpWeb('DefaultErrorDetail401');
  249. abp.ajax.defaultError403.Message = abp.localization.abpWeb('DefaultError403');
  250. abp.ajax.defaultError403.Details = abp.localization.abpWeb('DefaultErrorDetail403');
  251. abp.ajax.defaultError404.Message = abp.localization.abpWeb('DefaultError404');
  252. abp.ajax.defaultError404.Details = abp.localization.abpWeb('DefaultErrorDetail404');
  253. });
  254. })(jQuery);