You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
404 lines
12 KiB
404 lines
12 KiB
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); |