abp.jquery.js 9.1 KB

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