export function copy(obj) { return JSON.parse(JSON.stringify(obj)); } export function formatDate(date) { if (isEmpty(date)) { return "NaN"; } const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const monthStr = ("" + month).padStart(2, 0); const dayStr = ("" + day).padStart(2, 0); const formatted = year + "-" + monthStr + "-" + dayStr; return formatted; } export function formatTime(date) { const hours = date.getHours(); const minutes = date.getMinutes(); const hoursStr = ("" + hours).padStart(2, 0); const minutesStr = ("" + minutes).padStart(2, 0); const formatted = hoursStr + ":" + minutesStr; return formatted; } export function formatDatetime(date) { const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const monthStr = ("" + month).padStart(2, 0); const dayStr = ("" + day).padStart(2, 0); const hours = date.getHours(); const minutes = date.getMinutes(); const hoursStr = ("" + hours).padStart(2, 0); const minutesStr = ("" + minutes).padStart(2, 0); const formatted = year + "-" + monthStr + "-" + dayStr + " " + hoursStr + ":" + minutesStr; return formatted; } export function camelCase(name) { return name.substr(0, 1).toLowerCase() + name.substr(1); } export class UrlBuilder { constructor(url) { this.url = url; this.paramList = []; } append(name, value) { if (isNotEmpty(value)) { this.paramList.push({ name: name, value: value }); } return this; } build() { this.paramList.forEach((e, i, a) => { if (i === 0) { this.url += "?"; } else { this.url += "&"; } this.url += e.name + "=" + e.value; }); return this.url; } } export function isNotEmpty(val) { return val !== undefined && val !== null && val !== ""; } export function isEmpty(val) { return val === undefined || val === null || val === ""; } export function prepareUrl(url) { return new UrlBuilder(url); } export function debounce(fn, delay = 500) { let timer; return e => { e.persist(); clearTimeout(timer); timer = setTimeout(() => { fn(e); }, delay); }; } export function throttle(fn, delay, atleast) { let timeout = null, startTime = new Date(); return function () { let curTime = new Date(); clearTimeout(timeout); if (curTime - startTime >= atleast) { fn(); startTime = curTime; } else { timeout = setTimeout(fn, delay); } }; } export function clickUrl(url) { const httpLink = document.createElement("a"); httpLink.href = url; httpLink.target = "_blank"; httpLink.click(); } export function escape2Html(str) { var temp = document.createElement("div"); temp.innerHTML = str; var output = temp.innerText || temp.textContent; temp = null; return output; } export function groupBy(array, callback) { return array.reduce((groups, item) => { const key = typeof callback === 'function' ? callback(item) : item[callback]; if (!groups[key]) { groups[key] = []; } groups[key].push(item); return groups; }, {}); } export function formatPrice(price) { return Math.ceil(price).toLocaleString(); } export function formatPercent(number) { return Math.round(number * 100) + "%"; }