| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404 |
- var abp = abp || {};
- (function($) {
- if (!$) {
- throw "abp/jquery library requires the jquery library included to the page!";
- }
- // ABP CORE OVERRIDES /////////////////////////////////////////////////////
- abp.message._showMessage = function (message, title) {
- alert((title || '') + ' ' + message);
- return $.Deferred(function ($dfd) {
- $dfd.resolve();
- });
- };
- abp.message.confirm = function (message, titleOrCallback, callback) {
- if (titleOrCallback && !(typeof titleOrCallback == 'string')) {
- callback = titleOrCallback;
- }
- var result = confirm(message);
- callback && callback(result);
- return $.Deferred(function ($dfd) {
- $dfd.resolve(result);
- });
- };
- abp.utils.isFunction = function (obj) {
- return $.isFunction(obj);
- };
- // JQUERY EXTENSIONS //////////////////////////////////////////////////////
- $.fn.findWithSelf = function (selector) {
- return this.filter(selector).add(this.find(selector));
- };
- // DOM ////////////////////////////////////////////////////////////////////
- abp.dom = abp.dom || {};
- abp.dom.onNodeAdded = function (callback) {
- abp.event.on('abp.dom.nodeAdded', callback);
- };
- abp.dom.onNodeRemoved = function (callback) {
- abp.event.on('abp.dom.nodeRemoved', callback);
- };
- var mutationObserverCallback = function (mutationsList) {
- for (var i = 0; i < mutationsList.length; i++) {
- var mutation = mutationsList[i];
- if (mutation.type === 'childList') {
- if (mutation.addedNodes && mutation.removedNodes.length) {
- for (var k = 0; k < mutation.removedNodes.length; k++) {
- abp.event.trigger(
- 'abp.dom.nodeRemoved',
- {
- $el: $(mutation.removedNodes[k])
- }
- );
- }
- }
- if (mutation.addedNodes && mutation.addedNodes.length) {
- for (var j = 0; j < mutation.addedNodes.length; j++) {
- abp.event.trigger(
- 'abp.dom.nodeAdded',
- {
- $el: $(mutation.addedNodes[j])
- }
- );
- }
- }
- }
- }
- };
- $(function(){
- new MutationObserver(mutationObserverCallback).observe(
- $('body')[0],
- {
- subtree: true,
- childList: true
- }
- );
- });
- // AJAX ///////////////////////////////////////////////////////////////////
- abp.ajax = function (userOptions) {
- userOptions = userOptions || {};
- var options = $.extend(true, {}, abp.ajax.defaultOpts, userOptions);
- options.success = undefined;
- options.error = undefined;
- var xhr = null;
- var promise = $.Deferred(function ($dfd) {
- xhr = $.ajax(options)
- .done(function (data, textStatus, jqXHR) {
- $dfd.resolve(data);
- userOptions.success && userOptions.success(data);
- }).fail(function (jqXHR) {
- if(jqXHR.statusText === 'abort') {
- //ajax request is abort, ignore error handle.
- return;
- }
- if (jqXHR.getResponseHeader('_AbpErrorFormat') === 'true') {
- abp.ajax.handleAbpErrorResponse(jqXHR, userOptions, $dfd);
- } else {
- abp.ajax.handleNonAbpErrorResponse(jqXHR, userOptions, $dfd);
- }
- });
- }).promise();
- promise['jqXHR'] = xhr;
- return promise;
- };
- $.extend(abp.ajax, {
- defaultOpts: {
- dataType: 'json',
- type: 'POST',
- contentType: 'application/json',
- headers: {
- 'X-Requested-With': 'XMLHttpRequest'
- }
- },
- defaultError: {
- message: 'An error has occurred!',
- details: 'Error detail not sent by server.'
- },
- defaultError401: {
- message: 'You are not authenticated!',
- details: 'You should be authenticated (sign in) in order to perform this operation.'
- },
- defaultError403: {
- message: 'You are not authorized!',
- details: 'You are not allowed to perform this operation.'
- },
- defaultError404: {
- message: 'Resource not found!',
- details: 'The resource requested could not found on the server.'
- },
- logError: function (error) {
- abp.log.error(error);
- },
- showError: function (error) {
- if (error.details) {
- return abp.message.error(error.details, error.message);
- } else {
- return abp.message.error(error.message || abp.ajax.defaultError.message);
- }
- },
- handleTargetUrl: function (targetUrl) {
- if (!targetUrl) {
- location.href = abp.appPath;
- } else {
- location.href = targetUrl;
- }
- },
- handleErrorStatusCode: function (status) {
- switch (status) {
- case 401:
- abp.ajax.handleUnAuthorizedRequest(
- abp.ajax.showError(abp.ajax.defaultError401),
- abp.appPath
- );
- break;
- case 403:
- abp.ajax.showError(abp.ajax.defaultError403);
- break;
- case 404:
- abp.ajax.showError(abp.ajax.defaultError404);
- break;
- default:
- abp.ajax.showError(abp.ajax.defaultError);
- break;
- }
- },
- handleNonAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
- if (userOptions.abpHandleError !== false) {
- abp.ajax.handleErrorStatusCode(jqXHR.status);
- }
- $dfd.reject.apply(this, arguments);
- userOptions.error && userOptions.error.apply(this, arguments);
- },
- handleAbpErrorResponse: function (jqXHR, userOptions, $dfd) {
- var messagePromise = null;
- if (userOptions.abpHandleError !== false) {
- messagePromise = abp.ajax.showError(jqXHR.responseJSON.error);
- }
- abp.ajax.logError(jqXHR.responseJSON.error);
- $dfd && $dfd.reject(jqXHR.responseJSON.error, jqXHR);
- userOptions.error && userOptions.error(jqXHR.responseJSON.error, jqXHR);
- if (jqXHR.status === 401 && userOptions.abpHandleError !== false) {
- abp.ajax.handleUnAuthorizedRequest(messagePromise);
- }
- },
- handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
- if (messagePromise) {
- messagePromise.done(function () {
- abp.ajax.handleTargetUrl(targetUrl);
- });
- } else {
- abp.ajax.handleTargetUrl(targetUrl);
- }
- },
- blockUI: function (options) {
- if (options.blockUI) {
- if (options.blockUI === true) { //block whole page
- abp.ui.setBusy();
- } else { //block an element
- abp.ui.setBusy(options.blockUI);
- }
- }
- },
- unblockUI: function (options) {
- if (options.blockUI) {
- if (options.blockUI === true) { //unblock whole page
- abp.ui.clearBusy();
- } else { //unblock an element
- abp.ui.clearBusy(options.blockUI);
- }
- }
- },
- ajaxSendHandler: function (event, request, settings) {
- var token = abp.security.antiForgery.getToken();
- if (!token) {
- return;
- }
- if (!settings.headers || settings.headers[abp.security.antiForgery.tokenHeaderName] === undefined) {
- request.setRequestHeader(abp.security.antiForgery.tokenHeaderName, token);
- }
- }
- });
- $(document).ajaxSend(function (event, request, settings) {
- return abp.ajax.ajaxSendHandler(event, request, settings);
- });
- abp.event.on('abp.configurationInitialized', function () {
- var l = abp.localization.getResource('AbpUi');
- abp.ajax.defaultError.message = l('DefaultErrorMessage');
- abp.ajax.defaultError.details = l('DefaultErrorMessageDetail');
- abp.ajax.defaultError401.message = l('DefaultErrorMessage401');
- abp.ajax.defaultError401.details = l('DefaultErrorMessage401Detail');
- abp.ajax.defaultError403.message = l('DefaultErrorMessage403');
- abp.ajax.defaultError403.details = l('DefaultErrorMessage403Detail');
- abp.ajax.defaultError404.message = l('DefaultErrorMessage404');
- abp.ajax.defaultError404.details = l('DefaultErrorMessage404Detail');
- });
- // RESOURCE LOADER ////////////////////////////////////////////////////////
- /* UrlStates enum */
- var UrlStates = {
- LOADING: 'LOADING',
- LOADED: 'LOADED',
- FAILED: 'FAILED'
- };
- /* UrlInfo class */
- function UrlInfo(url) {
- this.url = url;
- this.state = UrlStates.LOADING;
- this.loadCallbacks = [];
- this.failCallbacks = [];
- }
- UrlInfo.prototype.succeed = function () {
- this.state = UrlStates.LOADED;
- for (var i = 0; i < this.loadCallbacks.length; i++) {
- this.loadCallbacks[i]();
- }
- };
- UrlInfo.prototype.failed = function () {
- this.state = UrlStates.FAILED;
- for (var i = 0; i < this.failCallbacks.length; i++) {
- this.failCallbacks[i]();
- }
- };
- UrlInfo.prototype.handleCallbacks = function (loadCallback, failCallback) {
- switch (this.state) {
- case UrlStates.LOADED:
- loadCallback && loadCallback();
- break;
- case UrlStates.FAILED:
- failCallback && failCallback();
- break;
- case UrlStates.LOADING:
- this.addCallbacks(loadCallback, failCallback);
- break;
- }
- };
- UrlInfo.prototype.addCallbacks = function (loadCallback, failCallback) {
- loadCallback && this.loadCallbacks.push(loadCallback);
- failCallback && this.failCallbacks.push(failCallback);
- };
- /* ResourceLoader API */
- abp.ResourceLoader = (function () {
- var _urlInfos = {};
- function getCacheKey(url) {
- return url;
- }
- function appendTimeToUrl(url) {
- if (url.indexOf('?') < 0) {
- url += '?';
- } else {
- url += '&';
- }
- url += '_=' + new Date().getTime();
- return url;
- }
- var _loadFromUrl = function (url, loadCallback, failCallback, serverLoader) {
- var cacheKey = getCacheKey(url);
- var urlInfo = _urlInfos[cacheKey];
- if (urlInfo) {
- urlInfo.handleCallbacks(loadCallback, failCallback);
- return;
- }
- _urlInfos[cacheKey] = urlInfo = new UrlInfo(url);
- urlInfo.addCallbacks(loadCallback, failCallback);
- serverLoader(urlInfo);
- };
- var _loadScript = function (url, loadCallback, failCallback) {
- _loadFromUrl(url, loadCallback, failCallback, function (urlInfo) {
- $.get({
- url: url,
- dataType: 'text'
- })
- .done(function (script) {
- $.globalEval(script);
- urlInfo.succeed();
- })
- .fail(function () {
- urlInfo.failed();
- });
- });
- };
- var _loadStyle = function (url) {
- _loadFromUrl(url, undefined, undefined, function (urlInfo) {
- $('<link/>', {
- rel: 'stylesheet',
- type: 'text/css',
- href: appendTimeToUrl(url)
- }).appendTo('head');
- });
- };
- return {
- loadScript: _loadScript,
- loadStyle: _loadStyle
- }
- })();
- })(jQuery);
|