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