@corpecca/qp-web-resources
Version:
Qp web resources
277 lines (232 loc) • 9.43 kB
JavaScript
(function (define) {
define(['jquery', 'qp-web-resources'], function ($, qp) {
return (function () {
if (!$) {
return;
}
if (!qp) {
return;
}
/* JQUERY ENHANCEMENTS ***************************************************/
// qp.ajax -> uses $.ajax ------------------------------------------------
qp.ajax = function (userOptions) {
userOptions = userOptions || {};
var options = $.extend(true, {}, qp.ajax.defaultOpts, userOptions);
var oldBeforeSendOption = options.beforeSend;
options.beforeSend = function (xhr, settings) {
if (oldBeforeSendOption) {
oldBeforeSendOption(xhr, settings);
}
xhr.setRequestHeader("Pragma", "no-cache");
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Expires", "Sat, 01 Jan 2000 00:00:00 GMT");
};
options.success = undefined;
options.error = undefined;
return $.Deferred(function ($dfd) {
$.ajax(options)
.done(function (data, textStatus, jqXHR) {
if (data.__qp) {
qp.ajax.handleResponse(data, userOptions, $dfd, jqXHR);
} else {
$dfd.resolve(data);
userOptions.success && userOptions.success(data);
}
}).fail(function (jqXHR) {
if (jqXHR.responseJSON && jqXHR.responseJSON.__qp) {
qp.ajax.handleResponse(jqXHR.responseJSON, userOptions, $dfd, jqXHR);
} else {
qp.ajax.handleNonQpErrorResponse(jqXHR, userOptions, $dfd);
}
});
});
};
$.extend(qp.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) {
qp.log.error(error);
},
showError: function (error) {
if (error.details) {
return qp.message.error(error.details, error.message);
} else {
return qp.message.error(error.message || qp.ajax.defaultError.message);
}
},
handleTargetUrl: function (targetUrl) {
if (!targetUrl) {
location.href = qp.appPath;
} else {
location.href = targetUrl;
}
},
handleNonQpErrorResponse: function (jqXHR, userOptions, $dfd) {
if (userOptions.qpHandleError !== false) {
switch (jqXHR.status) {
case 401:
qp.ajax.handleUnAuthorizedRequest(
qp.ajax.showError(qp.ajax.defaultError401),
qp.appPath
);
break;
case 403:
qp.ajax.showError(qp.ajax.defaultError403);
break;
case 404:
qp.ajax.showError(qp.ajax.defaultError404);
break;
default:
qp.ajax.showError(qp.ajax.defaultError);
break;
}
}
$dfd.reject.apply(this, arguments);
userOptions.error && userOptions.error.apply(this, arguments);
},
handleUnAuthorizedRequest: function (messagePromise, targetUrl) {
if (messagePromise) {
messagePromise.done(function () {
qp.ajax.handleTargetUrl(targetUrl);
});
} else {
qp.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) {
qp.ajax.handleTargetUrl(data.targetUrl);
}
} else if (data.success === false) {
var messagePromise = null;
if (data.error) {
if (userOptions.qpHandleError !== false) {
messagePromise = qp.ajax.showError(data.error);
}
} else {
data.error = qp.ajax.defaultError;
}
qp.ajax.logError(data.error);
$dfd && $dfd.reject(data.error, jqXHR);
userOptions.error && userOptions.error(data.error, jqXHR);
if (jqXHR.status === 401 && userOptions.qpHandleError !== false) {
qp.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
qp.ui.setBusy();
} else { //block an element
qp.ui.setBusy(options.blockUI);
}
}
},
unblockUI: function (options) {
if (options.blockUI) {
if (options.blockUI === true) { //unblock whole page
qp.ui.clearBusy();
} else { //unblock an element
qp.ui.clearBusy(options.blockUI);
}
}
},
ajaxSendHandler: function (event, request, settings) {
var token = qp.security.antiForgery.getToken();
if (!token) {
return;
}
if (!qp.security.antiForgery.shouldSendToken(settings)) {
return;
}
if (!settings.headers || settings.headers[qp.security.antiForgery.tokenHeaderName] === undefined) {
request.setRequestHeader(qp.security.antiForgery.tokenHeaderName, token);
}
}
});
$(document).ajaxSend(function (event, request, settings) {
return qp.ajax.ajaxSendHandler(event, request, settings);
});
/* JQUERY PLUGIN ENHANCEMENTS ********************************************/
/* jQuery Form Plugin
* http://www.malsup.com/jquery/form/
*/
// qpAjaxForm -> uses ajaxForm ------------------------------------------
if ($.fn.ajaxForm) {
$.fn.qpAjaxForm = function (userOptions) {
userOptions = userOptions || {};
var options = $.extend({}, $.fn.qpAjaxForm.defaults, userOptions);
options.beforeSubmit = function () {
qp.ajax.blockUI(options);
userOptions.beforeSubmit && userOptions.beforeSubmit.apply(this, arguments);
};
options.success = function (data) {
qp.ajax.handleResponse(data, userOptions);
};
//TODO: Error?
options.complete = function () {
qp.ajax.unblockUI(options);
userOptions.complete && userOptions.complete.apply(this, arguments);
};
return this.ajaxForm(options);
};
$.fn.qpAjaxForm.defaults = {
method: 'POST'
};
}
qp.event.on('qp.dynamicScriptsInitialized', function () {
qp.ajax.defaultError.message = qp.localization.qpWeb('DefaultError');
qp.ajax.defaultError.details = qp.localization.qpWeb('DefaultErrorDetail');
qp.ajax.defaultError401.message = qp.localization.qpWeb('DefaultError401');
qp.ajax.defaultError401.details = qp.localization.qpWeb('DefaultErrorDetail401');
qp.ajax.defaultError403.message = qp.localization.qpWeb('DefaultError403');
qp.ajax.defaultError403.details = qp.localization.qpWeb('DefaultErrorDetail403');
qp.ajax.defaultError404.message = qp.localization.qpWeb('DefaultError404');
qp.ajax.defaultError404.details = qp.localization.qpWeb('DefaultErrorDetail404');
});
return qp;
})();
});
}(typeof define === 'function' && define.amd
? define
: function (deps, factory) {
if (typeof module !== 'undefined' && module.exports) {
module.exports = factory(require('jquery'), require('qp-web-resources'));
} else {
window.qp = factory(window.jQuery, window.qp);
}
}));