Core.API = class {
/**
* Make a server call.
*
* @param {object} parameters
* @param {string} parameters.url
* @param {Object} parameters.data Server data to send with call
* @param {string} parameters.data.func Method name in file
* @param {function(object)} paramet"apiGetZoneFromZIP"ers.callback Function to process returned server data.
* @param {jQuery} parameters.$context Loader context
* @param {Object} parameters.fadeParameters Pass object or string
* @param {string} parameters.fadeParameters.text Text to display
* @param {boolean} parameters.fadeParameters.hideLoader When true, don't display loader unless error occurs
* @param {boolean} parameters.fadeParameters.textOnly When true, display only text, not loader icon
* @param {function()} parameters.precall Return false from this to stop server call
* @param {function()} parameters.complete Called after call is completed.
* @param {object} parameters.xhrFields
*/
static call(parameters) {
parameters.data = parameters.data || {};
parameters.data.page_id = Page.Meta.page_id;
if ($.isFunction(parameters.precall)) {
if (!precall()) {
return false;
}
}
if (!parameters.fadeParameters) {
parameters.fadeParameters = { text: '' };
} else if (typeof parameters.fadeParameters === 'string') {
parameters.fadeParameters = { text: parameters.fadeParameters };
}
if (!parameters.$context) {
parameters.$context = Page.getContext();
}
let idx = 0;
if (!parameters.fadeParameters.hideLoader && !parameters.fadeParameters.hide) {
idx = parameters.$context.fade('show', parameters.fadeParameters);
if (!idx) {
//showToast('Call failed', '', 'red');
console.error(parameters.$context);
return false;
}
}
let type = 'POST';
let methods = ['GET', 'POST', 'PUT', 'DELETE'];
for (let i in methods) {
if (parameters.url.startsWith(methods[i])) {
type = methods[i];
parameters.url = parameters.url.replace(methods[i] + ' ', '');
break;
}
}
// console.log(parameters.url);
// console.log(parameters.data.func);
return $.ajax({
url: parameters.url.toLowerCase(),
type: type,
dataType: (parameters.xhrFields ? null : 'json'),
data: parameters.data,
async: true,
xhrFields: parameters.xhrFields,
success: function (returnData) {
if (returnData.message) {
// console.log(parameters.data);
// console.debug(returnData.message);
}
if (returnData.error) {
console.log(returnData.error);
}
if (parameters.$context && parameters.$context.exists() && idx) {
try {
parameters.$context.fade('hide', idx);
} catch (e) { }
}
if (parameters.xhrFields && parameters.xhrFields.responseType === 'blob') {
parameters.callback(returnData);
return;
}
if (Core.User) {
Core.User.loggedInUser = returnData.logged_in_username;
}
if (!returnData.logged_in_username && returnData.force_login && Page.activePage != Page.Login) {
Page.Login.open();
} else if ($.isFunction(parameters.callback)) {
if (!returnData.return && !returnData.message) {
parameters.data.url = parameters.url;
returnData.message = 'Failed: ' + JSON.stringify(parameters.data, null, 2);
}
if (returnData.return) {
parameters.callback(returnData);
if (returnData.return == -1) {
showToast('', returnData.message, 'orange');
}
} else if (returnData.return != 2 && parameters.$context && parameters.$context.isVisible()) {
returnData.message = returnData.message.split('\\').join('
');
returnData.message = `
${returnData.message}
`;
showToast('', returnData.message, 'orange');
}
}
},
complete: function (data) {
if ($.isFunction(parameters.complete)) {
parameters.complete();
}
if (data) {
return;
}
if (!parameters.url.startsWith('/api')) {
return data;
}
if (parameters.$context && parameters.$context.isVisible() && $.isFunction(parameters.callback)) {
parameters.data.url = parameters.url;
let message = `
No data: ${JSON.stringify(parameters.data, null, 2)}
`;
parameters.$context.fade('dialog', message);
showToast('', message, 'red');
}
},
error: function (jqXHR) {
if (!parameters.url.startsWith('/api')) {
return;
}
if (parameters.$context && parameters.$context.isVisible() && idx) {
parameters.$context.fade('hide', idx);
}
if (parameters.$context && parameters.$context.isVisible() && $.isFunction(parameters.callback)) {
parameters.data.url = parameters.url;
let message = `Hard error: ${JSON.stringify(parameters.data, null, 2)}`;
if (jqXHR.responseText) {
message = jqXHR.responseText;
}
console.error(jqXHR);
message = `
${message}
`;
if (jqXHR.readyState !== 0) {
showToast('', message, 'red');
}
}
}
});
}
};