UNPKG

@corpecca/qp-web-resources

Version:
277 lines (232 loc) 9.43 kB
(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); } }));