Files
raven-client/ayanova/src/api/gzutil.js
2020-04-02 14:09:29 +00:00

154 lines
4.1 KiB
JavaScript

/* Xeslint-disable */
/////////////////////////////////
// General utility library
//
export default {
///////////////////////////////
// CLEAN OBJECT
// Clear all properties from object without resorting to assigning a new object (o={})
// which can be problematic in some cases (IE bugs, watched data items in forms etc)
removeAllPropertiesFromObject: function(o) {
for (let variableKey in o) {
if (o.hasOwnProperty(variableKey)) {
delete o[variableKey];
}
}
},
/**
* Copy a string to clipboard
* @param {String} string The string to be copied to clipboard
* @return {Boolean} returns a boolean correspondent to the success of the copy operation.
* Modified from an example here: https://stackoverflow.com/a/53951634/8939
* Basically a fallback if navigator.clipboard is not available
*/
copyToClipboard: function(string) {
let textarea;
let result;
if (navigator && navigator.clipboard) {
navigator.clipboard.writeText(string);
} else {
try {
textarea = document.createElement("textarea");
textarea.setAttribute("readonly", true);
textarea.setAttribute("contenteditable", true);
textarea.style.position = "fixed"; // prevent scroll from jumping to the bottom when focus is set.
textarea.value = string;
document.body.appendChild(textarea);
textarea.focus();
textarea.select();
const range = document.createRange();
range.selectNodeContents(textarea);
const sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
textarea.setSelectionRange(0, textarea.value.length);
result = document.execCommand("copy");
} catch (err) {
//console.error(err);
result = null;
} finally {
document.body.removeChild(textarea);
}
// manual copy fallback using prompt
if (!result) {
const isMac = navigator.platform.toUpperCase().indexOf("MAC") >= 0;
const copyHotkey = isMac ? "⌘C" : "CTRL+C";
result = prompt(`Press ${copyHotkey}`, string);
if (!result) {
return false;
}
}
}
return true;
},
///////////////////////////////
// CLEAN TAG NAME
// Clean up a tag with same rules as server
//
normalizeTag: function(tagName) {
//kebab case takes care of all the things we need for tags in one go
tagName = window.$gz._.kebabCase(tagName);
//No longer than 255 characters
tagName = tagName.length > 255 ? tagName.substr(0, 255 - 1) : tagName;
return tagName;
},
///////////////////////////////
// Quick hash for trivial purposes
// not cryptographic
// https://stackoverflow.com/a/7616484/8939
//
quickHash: function(theString) {
let hash = 0,
i,
chr;
if (theString.length === 0) return hash;
for (i = 0; i < theString.length; i++) {
chr = theString.charCodeAt(i);
hash = (hash << 5) - hash + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
},
///////////////////////////////
// CONVERT STRING TO BOOLEAN
// https://stackoverflow.com/a/1414175/8939
//
stringToBoolean: function(string) {
switch (string.toLowerCase().trim()) {
case "true":
case "yes":
case "1":
return true;
case "false":
case "no":
case "0":
case null:
return false;
default:
return Boolean(string);
}
}, ///////////////////////////////
// CONVERT STRING TO FLOAT
// https://stackoverflow.com/a/9409894/8939
//
stringToFloat: function(string) {
//null or empty then zero
if (!string) {
return 0;
}
//A number already then parse and return
if (window.$gz._.isNumber(string)) {
if (string === NaN) {
return 0;
}
return parseFloat(string);
}
//Not a string at all?
if (!window.$gz._.isString(string)) {
return 0;
}
let ret = parseFloat(string.replace(/[^\d.-]/g, ""));
if (ret == NaN) {
return 0;
}
return ret;
}
//new functions above here
};