TTS Framework - JavaScript assets.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
tts_js/core/addons/ajax.js

181 lines
6.6 KiB

/**
* AJAX
* @author Robert Strutts <Robert@TryingToScale.com>
* @copyright Copyright (c) 2019, Robert Strutts.
* @license https://mit-license.org/
*/
tts.grab_form = function (form_id) {
try {
let myForm = document.getElementById(form_id);
let arr = {};
for (var i = 0; i < myForm.elements.length; i++) {
let id = myForm.elements[i].id;
let value = myForm.elements[i].value;
let node = myForm.elements[i].nodeName;
if ((node == "INPUT" || node == "TEXTAREA" || node == "SELECT") && (typeof id !== "undefined" && id !== "")) {
arr[id] = value;
}
}
return arr;
} catch (e) {
tts.logger(e);
return false;
}
};
function json_parse(json) {
try {
var obj = JSON.parse(json);
var unfetched = obj.unfetched;
if (typeof unfetched !== "undefined") {
console.warn(`You have some unFetched JSON Vars: ${unfetched}`);
}
var err = obj.error;
if (typeof err === "undefined") {
return obj;
} else if (err !== null) {
throw err;
}
} catch (e) {
return e;
}
}
tts.send_json = function (php_script, args) {
let myPromise = new Promise(function (myResolve, myReject) {
if (args === false) {
let nodata = "No Data from Form!";
throw nodata;
}
var xmlhttp = new XMLHttpRequest(); // new HttpRequest instance
xmlhttp.open("POST", php_script);
xmlhttp.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xmlhttp.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) {
myResolve(json_parse(this.response));
} else {
myReject(json_parse(this.response));
}
}
};
xmlhttp.send(JSON.stringify(args));
});
return myPromise;
};
tts.Post = function (url, data) {
return new Promise((resolve, reject) => {
var request = new XMLHttpRequest();
request.open("POST", url, true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.onload = function (d) {
resolve(d.currentTarget.responseText);
};
try {
request.send(data);
} catch (err) {
reject(err);
}
});
};
function doProgress(eventName, evt) {
if (eventName !== false && evt.lengthComputable) {
var percentComplete = (evt.loaded / evt.total) * 100;
var pc = Math.round(percentComplete);
var event = new CustomEvent(eventName, {detail: {progress: pc}});
var el = document.getElementsByTagName('body')[0];
el.dispatchEvent(event);
}
}
function setHTML(elementID, html) {
try {
return document.getElementById(elementID).innerHTML = html;
} catch (e) {
tts.logger("ID of " + elementID + " not found...!", "warn");
}
}
tts.lastAjax = false; /* So you can use the xmlHttp Request later on... if not cached... */
let ajaxCallback = function (url, resolve, reject, options) {
var doCache = tts.getValue(options.useCache, false), eventName = tts.getValue(options.eventName, false);
var elementID = tts.getValue(options.elementID, false), ts = tts.getValue(options.ts, "");
if (doCache) {
var myCache = new tts.store();
if (myCache) {
let stored_data = myCache.get(url + ts); /* timestamp cache buster */
let done = tts.getValue(stored_data, false);
if (!tts.isEmpty(done)) {
tts.logger('Used cache, on ' + url + ' !');
tts.lastAjax = false;
doProgress(eventName, {lengthComputable: true, loaded: 100, total: 100});
if (elementID) {
setHTML(elementID, stored_data);
}
return resolve(stored_data);
} else {
tts.logger('Adding to cache, for ' + url + ' !');
}
} else {
tts.logger('No Cache Engine enabled, for ' + url + ' !');
}
} else {
tts.logger('No Caching, for ' + url);
}
var xmlHttp = new XMLHttpRequest();
tts.lastAjax = xmlHttp;
xmlHttp.upload.addEventListener("progress", function (evt) {
doProgress(eventName, evt);
});
xmlHttp.addEventListener("progress", function (evt) {
doProgress(eventName, evt);
});
xmlHttp.onreadystatechange = function () {
var result;
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
switch (options.dataType) {
case 'xml':
result = xmlHttp.responseXML;
break;
case 'json':
result = JSON.parse(xmlHttp.responseText);
break;
default:
result = xmlHttp.responseText;
break;
}
if (myCache && doCache) {
myCache.set(url + ts, result);
}
if (elementID) {
setHTML(elementID, result);
}
resolve(result);
} else if (reject) {
reject('Ajax error: ' + xmlHttp.status + ' url: ' + url);
}
}
};
xmlHttp.open(options.method || 'GET', url + ts, true);
if (options.headers) {
for (var key in options.headers) {
xmlHttp.setRequestHeader(key, options.headers[key]);
}
}
xmlHttp.send(options.data || '');
};
tts.ajax = function (url, options) {
if (typeof options === "undefined") {
options = {};
}
return new Promise(function (resolve, reject) {
ajaxCallback(url, resolve, reject, options);
});
};
/*
* End of AJAX
*/