@amxchange/grid-view-web-client
Version:
amxchange grid view framework web client in react ( a module extracted from existing jax )
375 lines (342 loc) • 12.6 kB
JavaScript
const commonUtils = {
//source: https://stackoverflow.com/a/22583327/3248247
notify(title, msg) {
let notification;
let options = {};
if (msg) options.body = msg;
if (!("Notification" in window)) {
console.error("This browser does not support desktop notification");
} else if (Notification.permission === "granted") {
notification = new Notification(title, options);
}
// Otherwise, we need to ask the user for permission
else if (Notification.permission !== "denied") {
Notification.requestPermission(function (permission) {
// If the user accepts, let's create a notification
if (permission === "granted") {
notification = new Notification(title, options);
}
});
}
return notification;
},
param(obj) {
let app = {},
class2type = {},
toString = class2type.toString,
r20 = /%20/g,
rbracket = /\[\]$/;
function type(obj) {
if (obj == null) {
return obj + "";
}
// Support: Android < 4.0, iOS < 6 (functionish RegExp)
return typeof obj === "object" || typeof obj === "function"
? class2type[toString.call(obj)] || "object"
: typeof obj;
}
function isFunction(obj) {
return type(obj) === "function";
}
function buildParams(prefix, obj, add) {
var name, key, value;
if (Array.isArray(obj)) {
for (var key in obj) {
value = obj[key];
if (rbracket.test(prefix)) add(prefix, value);
else buildParams(prefix + "[" + (typeof v === "object" ? i : "") + "]", value, add);
}
} else if (type(obj) === "object") {
for (name in obj) buildParams(prefix + "[" + name + "]", obj[name], add);
} else add(prefix, obj);
}
function param(obj) {
var prefix,
key,
value,
serialized = [],
add = function (key, value) {
value = isFunction(value) ? value() : value == null ? "" : value;
serialized[serialized.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
};
if (Array.isArray(obj)) {
for (key in obj) {
value = obj[key];
add(key, value);
}
} else {
for (prefix in obj) buildParams(prefix, obj[prefix], add);
}
return serialized.join("&").replace(r20, "+");
}
return param(obj);
},
serializeParams: function (params) {
var str = "";
for (var key in params) {
if (params.hasOwnProperty(key)) {
if (str !== "") str += "&";
str += key + "=" + params[key];
}
}
return str;
},
exportToCSV(rows) {
let csvContent = "data:text/csv;charset=utf-8,";
rows.forEach(function (rowArray) {
rowArray = rowArray.map(cell => `"${cell}"`);
let row = rowArray.join(",");
csvContent += row + "\r\n"; // add carriage return
});
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "transaction_history.csv");
document.body.appendChild(link); // Required for FF
link.click();
},
debounce(fn, delay) {
var timer = null;
return function () {
var context = this,
args = arguments;
clearTimeout(timer);
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
};
},
toTitleCase(str) {
if (!str) return "";
return str.replace(/\w\S*/g, function (txt) {
return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
});
},
toSentenceCase(str) {
if (!str) return "";
return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();
},
toCurrencySymbol(str) {
if (currencySymbolMap[str]) {
return String.fromCharCode(currencySymbolMap[str]);
} else {
return str;
}
},
numberWithCommas(x) {
if (isNaN(x) || x === null) return "";
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
},
round(number, precision) {
if (precision === undefined) return number;
var factor = Math.pow(10, precision);
var tempNumber = number * factor;
var roundedTempNumber = Math.round(tempNumber);
return roundedTempNumber / factor;
},
roundDown(number, precision) {
if (precision === undefined) return number;
var factor = Math.pow(10, precision);
var tempNumber = number * factor;
var roundedTempNumber = -Math.round(-tempNumber);
return roundedTempNumber / factor;
},
roundedWithCommas(number, precision) {
if (isNaN(number) || number === null) return "";
return this.numberWithCommas(this.round(number, precision));
},
objectFromArrayOfKeys(arr, val) {
let finalObj;
arr.reverse().map((key, i) => {
let temp = {};
if (i === 0) {
temp[key] = val;
} else {
temp[key] = finalObj;
}
finalObj = temp;
});
return finalObj;
},
isEmptyObject(obj) {
return Object.keys(obj).length === 0 && obj.constructor === Object;
},
exportToXLS(rows, fileName) {
rows = rows.map(function (rowArray) {
return rowArray.map(cell => ({ value: cell, type: "string" }));
});
zipcelx({
filename: fileName || "Report",
sheet: {
data: rows
}
});
},
getParameterByName(name, url) {
if (!url) url = window.location.href;
name = name.replace(/[\[\]]/g, "\\$&");
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
results = regex.exec(url);
if (!results) return null;
if (!results[2]) return "";
return decodeURIComponent(results[2].replace(/\+/g, " "));
},
removeParameterByName(name, search) {
if (!search) search = window.location.search;
let searchParams = new URLSearchParams(search);
searchParams.delete(name);
let _search = searchParams.toString().length > 0 ? "?" + searchParams.toString() : "";
let newUrl =
window.location.protocol +
"//" +
window.location.host +
window.location.pathname +
_search +
window.location.hash;
if (history.replaceState) {
history.replaceState(null, "", newUrl);
}
},
regexpStringToObj(regexpString) {
let regexpMatcher = /\/(.+)\/([gmiyus]{0,6})/;
let regexpWithoutSlashes = regexpString.replace(regexpMatcher, `$1${REGEX_SPLITTER}$2`);
return new RegExp(...regexpWithoutSlashes.split(REGEX_SPLITTER));
},
throttle(fn, wait) {
let inThrottle, lastFn, lastTime;
return function () {
const context = this,
args = arguments;
if (!inThrottle) {
fn.apply(context, args);
lastTime = Date.now();
inThrottle = true;
} else {
clearTimeout(lastFn);
lastFn = setTimeout(function () {
if (Date.now() - lastTime >= wait) {
fn.apply(context, args);
lastTime = Date.now();
}
}, Math.max(wait - (Date.now() - lastTime), 0));
}
};
},
shallowEqual(a, b) {
// Create arrays of property names
if (!a || !b) {
//if they are falsy values, just return plain equality
return a === b;
}
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// If number of properties is different,
// objects are not equivalent
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (a[propName] !== b[propName]) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
},
getBase64(file) {
return new Promise((resolve, reject) => {
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function () {
// console.log(reader.result);
resolve(reader.result);
};
reader.onerror = function (error) {
// console.log('Error: ', error);
reject(error);
};
});
},
getBase64Image(img) {
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
var dataURL = canvas.toDataURL("image/png");
return dataURL.replace(/^data:image\/(png|jpg);base64,/, "");
},
getBase64ImageFromUrl(url) {
let img = new Image();
img.src = url;
return this.getBase64Image(img);
},
deepCloneObj(obj) {
return JSON.parse(JSON.stringify(obj));
},
runPromiseInSequence(arr, input) {
return new Promise((resolve, reject) => {
let promiseChain = arr.reduce(
(promiseChain, currentFunction) => promiseChain.then(currentFunction),
Promise.resolve(input)
);
promiseChain
.then(finalResponse => {
resolve(finalResponse.response);
})
.catch(error => {
reject(error);
});
});
},
/*
* func _ has capability of performing reading operations ( i.e, GET, HAS, SIZE ) on given object
* and hence cannot perform any operations ( SET, DELETE, CLEAR ) aiming to modify given object.
*/
customMapUtil(map = {}, action = null, key = null) {
if (typeof action === "string") {
let mapKeys = Object.keys(map);
let _value;
switch (action.toUpperCase()) {
case "GET":
_value = mapKeys.indexOf(key) > -1 ? map[key] : null;
break;
case "HAS":
_value = mapKeys.indexOf(key) > -1 ? true : false;
break;
case "SIZE":
_value = mapKeys.length;
break;
default:
_value = null; /* "Unknown action!!" */
}
return _value;
}
return null; /* "Action should be strictly string!!" */
},
getCookie(cname) {
let name = cname + "=";
let decodedCookie = decodeURIComponent(document.cookie);
let ca = decodedCookie.split(";");
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) == " ") {
c = c.substring(1);
}
if (c.indexOf(name) == 0) {
return c.substring(name.length, c.length);
}
}
return "";
},
getTenant(meta) {
let { userDetails } = meta || {};
let { tenant } = userDetails || "";
return tenant;
}
};
export default commonUtils;