var wcp = wcp || {};
|
(function ($) {
|
|
if (!$) {
|
return;
|
}
|
|
/* JQUERY ENHANCEMENTS ***************************************************/
|
|
// wcp.ajax -> uses $.ajax ------------------------------------------------
|
|
wcp.ajax = function (userOptions) {
|
userOptions = userOptions || {};
|
|
var options = $.extend({}, wcp.ajax.defaultOpts, userOptions);
|
options.success = undefined;
|
options.error = undefined;
|
|
return $.Deferred(function ($dfd) {
|
$.ajax(options)
|
.done(function (data, textStatus, jqXHR) {
|
// if (data.__wcp) {
|
wcp.ajax.handleResponse(data, userOptions, $dfd, jqXHR);
|
// } else {
|
// $dfd.resolve(data);
|
// userOptions.success && userOptions.success(data);
|
// }
|
}).fail(function (jqXHR) {
|
if (jqXHR.responseJSON && jqXHR.responseJSON.__wcp) {
|
wcp.ajax.handleResponse(jqXHR.responseJSON, userOptions, $dfd, jqXHR);
|
} else {
|
wcp.ajax.handleNonwcpErrorResponse(jqXHR, userOptions, $dfd);
|
}
|
});
|
});
|
};
|
|
//设置全局ajax禁用缓存
|
$.ajaxSetup({
|
cache: false
|
});
|
|
$.extend(wcp.ajax, {
|
defaultOpts: {
|
dataType: 'json',
|
type: 'POST',
|
contentType: 'application/json'
|
},
|
|
defaultError: {
|
message: '发生了一个错误!',
|
details: '服务器没有发送错误详细信息。'
|
},
|
|
defaultError401: {
|
message: '你没有经过认证!',
|
details: '您应该通过身份验证(登录)才能执行此操作。'
|
},
|
|
defaultError403: {
|
message: '你没有得到授权!',
|
details: '你没有权限执行该操作。'
|
},
|
|
defaultError404: {
|
message: '未找到资源!',
|
details: '无法在服务器上找到请求的资源。'
|
},
|
|
logError: function (error) {
|
wcp.log.error(error);
|
},
|
|
showError: function (error) {
|
if (error.details) {
|
return wcp.message.error(error.details, error.message);
|
} else {
|
return wcp.message.error(error.message || wcp.ajax.defaultError.message);
|
}
|
},
|
|
handleTargetUrl: function (targetUrl) {
|
if (!targetUrl) {
|
location.href = wcp.appPath;
|
} else {
|
location.href = targetUrl;
|
}
|
},
|
|
handleNonwcpErrorResponse: function (jqXHR, userOptions, $dfd) {
|
if (userOptions.wcpHandleError !== false) {
|
switch (jqXHR.status) {
|
case 401:
|
wcp.ajax.handleUnAuthorizedRequest(
|
wcp.ajax.showError(wcp.ajax.defaultError401),
|
wcp.appPath
|
);
|
break;
|
case 403:
|
wcp.ajax.showError(wcp.ajax.defaultError403);
|
break;
|
case 404:
|
wcp.ajax.showError(wcp.ajax.defaultError404);
|
break;
|
default:
|
wcp.ajax.showError(wcp.ajax.defaultError);
|
break;
|
}
|
}
|
|
$dfd.reject.apply(this, arguments);
|
userOptions.error && userOptions.error.apply(this, arguments);
|
},
|
|
handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
|
if (messagePromise) {
|
messagePromise.done(function () {
|
wcp.ajax.handleTargetUrl(targetUrl);
|
});
|
} else {
|
wcp.ajax.handleTargetUrl(targetUrl);
|
}
|
},
|
|
handleResponse: function (data, userOptions, $dfd, jqXHR) {
|
if (data) {
|
if (data.success === true) {
|
$dfd && $dfd.resolve(data.result, data, jqXHR);
|
userOptions.success && userOptions.success(data.result, data, jqXHR);
|
|
if (data.targetUrl) {
|
wcp.ajax.handleTargetUrl(data.targetUrl);
|
}
|
} else if (data.success === false) {
|
var messagePromise = null;
|
|
if (data.error) {
|
if (userOptions.wcpHandleError !== false) {
|
messagePromise = wcp.ajax.showError(data.error);
|
}
|
} else {
|
data.error = wcp.ajax.defaultError;
|
}
|
|
wcp.ajax.logError(data.error);
|
|
$dfd && $dfd.reject(data.error, jqXHR);
|
userOptions.error && userOptions.error(data.error, jqXHR);
|
|
if ((jqXHR.status === 401 || (data.error && data.error.code == 401)) && userOptions.wcpHandleError !== false) {
|
wcp.ajax.handleUnAuthorizedRequest(messagePromise, data.targetUrl);
|
}
|
} else { //not wrapped result
|
$dfd && $dfd.resolve(data, null, jqXHR);
|
userOptions.success && userOptions.success(data, null, jqXHR);
|
}
|
} else { //no data sent to back
|
$dfd && $dfd.resolve(jqXHR);
|
userOptions.success && userOptions.success(jqXHR);
|
}
|
},
|
|
blockUI: function (options) {
|
if (options.blockUI) {
|
if (options.blockUI === true) { //block whole page
|
wcp.ui.setBusy();
|
} else { //block an element
|
wcp.ui.setBusy(options.blockUI);
|
}
|
}
|
},
|
|
unblockUI: function (options) {
|
if (options.blockUI) {
|
if (options.blockUI === true) { //unblock whole page
|
wcp.ui.clearBusy();
|
} else { //unblock an element
|
wcp.ui.clearBusy(options.blockUI);
|
}
|
}
|
},
|
|
ajaxSendHandler: function (event, request, settings) {
|
// var token = wcp.security.antiForgery.getToken();
|
// if (!token) {
|
// return;
|
// }
|
//
|
// if (!settings.headers || settings.headers[wcp.security.antiForgery.tokenHeaderName] === undefined) {
|
// request.setRequestHeader(wcp.security.antiForgery.tokenHeaderName, token);
|
// }
|
}
|
});
|
|
$(document).ajaxSend(function (event, request, settings) {
|
return wcp.ajax.ajaxSendHandler(event, request, settings);
|
});
|
|
/* JQUERY PLUGIN ENHANCEMENTS ********************************************/
|
|
/* jQuery Form Plugin
|
* http://www.malsup.com/jquery/form/
|
*/
|
|
// wcpAjaxForm -> uses ajaxForm ------------------------------------------
|
|
if ($.fn.ajaxForm) {
|
$.fn.wcpAjaxForm = function (userOptions) {
|
userOptions = userOptions || {};
|
|
var options = $.extend({}, $.fn.wcpAjaxForm.defaults, userOptions);
|
|
options.beforeSubmit = function () {
|
wcp.ajax.blockUI(options);
|
userOptions.beforeSubmit && userOptions.beforeSubmit.apply(this, arguments);
|
};
|
|
options.success = function (data) {
|
wcp.ajax.handleResponse(data, userOptions);
|
};
|
|
//TODO: Error?
|
|
options.complete = function () {
|
wcp.ajax.unblockUI(options);
|
userOptions.complete && userOptions.complete.apply(this, arguments);
|
};
|
|
return this.ajaxForm(options);
|
};
|
|
$.fn.wcpAjaxForm.defaults = {
|
method: 'POST'
|
};
|
}
|
})(jQuery);
|