abp.jquery.js 9.1 KB

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