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'; } });