function uuidv4() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { let r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } function formatMoney(amount, decimalCount = 2, decimal = ".", thousands = ",") { try { decimalCount = Math.abs(decimalCount); decimalCount = isNaN(decimalCount) ? 2 : decimalCount; const negativeSign = amount < 0 ? "-" : ""; let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString(); let j = (i.length > 3) ? i.length % 3 : 0; return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : ""); } catch (e) { console.log(e); } } /** * Create a new toast message and return it. * @param {string} title * @param {string} message * @param {string} color * @return {jQuery} toast object */ function showToast(title, message, color) { return $('body').toast({ displayTime: 'auto', showProgress: 'top', classProgress: color, className: { toast: 'ui message' }, closeIcon: true, title: title, message: message, closeOnClick: false, class: color }); } const delay = ms => new Promise(res => setTimeout(res, ms)); /** * Copy text to clipboard. */ function copyTextToClipboard(text) { let textArea = document.createElement("textarea"); textArea.style.position = 'fixed'; textArea.style.top = 0; textArea.style.left = 0; textArea.style.width = '2em'; textArea.style.height = '2em'; textArea.style.padding = 0; textArea.style.border = 'none'; textArea.style.outline = 'none'; textArea.style.boxShadow = 'none'; textArea.style.background = 'transparent'; textArea.value = text; document.body.appendChild(textArea); textArea.focus(); textArea.select(); try { let successful = document.execCommand('copy'); let msg = successful ? 'successful' : 'unsuccessful'; alert('Copying text was ' + msg); } catch (err) { alert('Failed to copy'); } document.body.removeChild(textArea); } function convertHtmlToRtf(html) { if (!(typeof html === "string" && html)) { return null; } let tmpRichText, hasHyperlinks; let richText = html; // Singleton tags richText = richText.replace(/<(?:hr)(?:\s+[^>]*)?\s*[\/]?>/ig, "{\\pard \\brdrb \\brdrs \\brdrw10 \\brsp20 \\par}\n{\\pard\\par}\n"); richText = richText.replace(/<(?:br)(?:\s+[^>]*)?\s*[\/]?>/ig, "{\\pard\\par}\n"); // Empty tags richText = richText.replace(/<(?:p|div|section|article)(?:\s+[^>]*)?\s*[\/]>/ig, "{\\pard\\par}\n"); richText = richText.replace(/<(?:[^>]+)\/>/g, ""); // Hyperlinks richText = richText.replace( /]*)?(?:\s+href=(["'])(?:javascript:void\(0?\);?|#|return false;?|void\(0?\);?|)\1)(?:\s+[^>]*)?>/ig, "{{{\n"); tmpRichText = richText; richText = richText.replace( /]*)?(?:\s+href=(["'])(.+)\1)(?:\s+[^>]*)?>/ig, "{\\field{\\*\\fldinst{HYPERLINK\n \"$2\"\n}}{\\fldrslt{\\ul\\cf1\n"); hasHyperlinks = richText !== tmpRichText; richText = richText.replace(/]*)?>/ig, "{{{\n"); richText = richText.replace(/<\/a(?:\s+[^>]*)?>/ig, "\n}}}"); // Start tags richText = richText.replace(/<(?:b|strong)(?:\s+[^>]*)?>/ig, "{\\b\n"); richText = richText.replace(/<(?:i|em)(?:\s+[^>]*)?>/ig, "{\\i\n"); richText = richText.replace(/<(?:u|ins)(?:\s+[^>]*)?>/ig, "{\\ul\n"); richText = richText.replace(/<(?:strike|del)(?:\s+[^>]*)?>/ig, "{\\strike\n"); richText = richText.replace(/]*)?>/ig, "{\\super\n"); richText = richText.replace(/]*)?>/ig, "{\\sub\n"); richText = richText.replace(/<(?:p|div|section|article)(?:\s+[^>]*)?>/ig, "{\\pard\n"); // End tags richText = richText.replace(/<\/(?:p|div|section|article)(?:\s+[^>]*)?>/ig, "\n\\par}\n"); richText = richText.replace(/<\/(?:b|strong|i|em|u|ins|strike|del|sup|sub)(?:\s+[^>]*)?>/ig, "\n}"); // Strip any other remaining HTML tags [but leave their contents] richText = richText.replace(/<(?:[^>]+)>/g, ""); // Prefix and suffix the rich text with the necessary syntax richText = "{\\rtf1\\ansi\n" + (hasHyperlinks ? "{\\colortbl\n;\n\\red0\\green0\\blue255;\n}\n" : "") + richText + "\n}"; return richText; }