177 lines
5.0 KiB
JavaScript
177 lines
5.0 KiB
JavaScript
import $ from 'jquery'
|
|
import Service from '@ember/service';
|
|
|
|
export default Service.extend({
|
|
/**
|
|
* Ajax.doGet('url.get',
|
|
* {id: 001, name: 'foo'},
|
|
* function(data) {
|
|
* // success
|
|
* }, function(msg) {
|
|
* // fail
|
|
* });
|
|
* no params
|
|
* Ajax.doGet('url.get',
|
|
* function(data) {
|
|
* // success
|
|
* }, function(msg){
|
|
* // fail
|
|
* });
|
|
* @param {Boolean} [loadmask] optional
|
|
* @param {String} url
|
|
* @param {Object} [params]
|
|
* @param {Function} [fnSucc]
|
|
* @param {Function} [fnFail]
|
|
*/
|
|
doGet() {
|
|
this._process_request(arguments, 'GET');
|
|
},
|
|
/**
|
|
* @see #get
|
|
*/
|
|
doPost() {
|
|
this._process_request(arguments, 'POST');
|
|
},
|
|
/**
|
|
* @see #get
|
|
*/
|
|
doPatch() {
|
|
this._process_request(arguments, 'PATCH');
|
|
},
|
|
/**
|
|
* @see #get
|
|
*/
|
|
doPut() {
|
|
this._process_request(arguments, 'PUT');
|
|
},
|
|
/**
|
|
* @see #get
|
|
*/
|
|
doDel() {
|
|
this._process_request(arguments, 'DELETE');
|
|
},
|
|
/**
|
|
* private
|
|
*/
|
|
_request(p) {
|
|
const me = this;
|
|
p.loadmask && me.set('loading', true);
|
|
var formDataCfg;
|
|
if (p.params instanceof FormData) {
|
|
formDataCfg = false;
|
|
}
|
|
|
|
$.ajax({
|
|
url: p.url,
|
|
data: p.params,
|
|
type: p.method,
|
|
contentType: formDataCfg,
|
|
processData: formDataCfg,
|
|
success(r, status, resp) {
|
|
if (r.success) {
|
|
// ignore success callback
|
|
if (p.fnSucc !== false) {
|
|
me._isFunc(p.fnSucc) ?
|
|
p.fnSucc(r.data) :
|
|
me.message.alert(r.data || 'Ajax Request Successfully');
|
|
}
|
|
}
|
|
// ignore fail callback
|
|
else if (p.fnFail !== false) {
|
|
me._isFunc(p.fnFail) ? p.fnFail(r.error, r) :
|
|
me.dialog.error(r.error || 'Ajax Request Error Caused');
|
|
}
|
|
else {
|
|
me.dialog.error(r.error || 'Ajax Request Error Caused');
|
|
}
|
|
p.loadmask && me.set('loading', false);
|
|
},
|
|
error(jqXHR, textStatus) {
|
|
console.log('Ajax request error caused', arguments);
|
|
const dialog = me.get('dialog');
|
|
if (jqXHR.status === 401) {
|
|
if (window.localStorage) {
|
|
window.localStorage.setItem('prevURL', window.location.href);
|
|
}
|
|
window.location.href = jqXHR.getResponseHeader('location')
|
|
}
|
|
else if (textStatus === 'timeout') {
|
|
dialog.error('Ajax Request Timeout Error Caused.');
|
|
}
|
|
else if (textStatus === 'abort') {
|
|
dialog.error('Ajax Request Client Abort Error Caused.');
|
|
}
|
|
else {
|
|
dialog.error('Ajax Request Error Caused.');
|
|
}
|
|
p.loadmask && me.set('loading', false);
|
|
}
|
|
});
|
|
},
|
|
/**
|
|
* {
|
|
* [lm], [url], [params], [fnSucc], [fnFail]
|
|
* }
|
|
*/
|
|
_process_request(args, method) {
|
|
var me = this;
|
|
if (args && args.length) {
|
|
// args to array
|
|
args = Array.prototype.slice.call(args);
|
|
var lm = args.shift(), // loadmask
|
|
url,
|
|
p,
|
|
fnSucc,
|
|
fnFail;
|
|
// loadmask
|
|
if ($.type(lm) === 'boolean') {
|
|
url = args.shift();
|
|
}
|
|
else {
|
|
url = lm;
|
|
// default loadmask
|
|
lm = true;
|
|
}
|
|
me._parse_params_and_callbacks(args);
|
|
// params
|
|
p = args.shift();
|
|
// callbacks
|
|
fnSucc = args.shift();
|
|
fnFail = args.shift();
|
|
// Ajax Request
|
|
me._request({
|
|
loadmask: lm,
|
|
method: /GET|POST|PATCH|PUT|DELETE/i.test(method) ? method.toUpperCase() : 'GET',
|
|
url: url,
|
|
params: p,
|
|
fnSucc: fnSucc,
|
|
fnFail: fnFail
|
|
});
|
|
}
|
|
else {
|
|
console.error('Ajax no args given.');
|
|
}
|
|
},
|
|
/**
|
|
* params, fnSucc, fnFail
|
|
* fnSucc, fnFail
|
|
* fnFail
|
|
*/
|
|
_parse_params_and_callbacks(args) {
|
|
// has callbacks
|
|
if (this._isFunc(args[1]) && this._isFunc(args[2])) {
|
|
this._isFunc(args[0]) && (args[0] = args[0]());
|
|
}
|
|
// no params, params is success callback
|
|
else if (this._isFunc(args[0])) {
|
|
args[2] = args[1];
|
|
args[1] = args[0];
|
|
args[0] = null;
|
|
}
|
|
},
|
|
_isFunc(f) {
|
|
return $.type(f) === 'function';
|
|
}
|
|
});
|
|
|