// Utilities const characters ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; function randomString(length) { let result = ''; const charactersLength = characters.length; for ( let i = 0; i < length; i++ ) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } // serializeObject tweak to allow '.' to nest keys, and '-' in keys $.extend(FormSerializer.patterns, { fixed: /^\d+$/, validate: /^[a-z][a-z0-9_-]*(?:\.[a-z0-9_-]+|\[[0-9]+\])*(?:\[\])?$/i, key: /[a-z0-9_-]+|(?=\[\])/gi, named: /^[a-z0-9_-]+$/i }); // deserializeObject jQuery.fn.populate = function (data) { if (!this.is('form')) throw "Error: ${this} is not a form"; populate(this[0], data); return this; }; // Toasts function clearNotif() { let infoBox = $('#information'); infoBox.removeClass('alert-info alert-success alert-warning alert-danger show'); infoBox.addClass('hide'); infoBox.find('.toast-text').text(''); store.remove('notif'); } function notif(type, msg) { console.log(type) let infoBox = $('#information'); clearNotif(); infoBox.removeClass('hide'); infoBox.addClass(`alert-${type} show`); infoBox.find('.toast-text').text(msg); } // crypto async function digestMessage(message) { const msgUint8 = new TextEncoder().encode(message); // encode as (utf-8) Uint8Array const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8); // hash the message const hashArray = Array.from(new Uint8Array(hashBuffer)); // convert buffer to byte array const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join(''); // convert bytes to hex string return hashHex; } // number formats function setDecimals() { // due to a W3C decision, "number" inputs do not expose their selection, breaking inputmask library $('input[data-decimals="0"]').inputmask({ alias: 'integer', placeholder: '0', groupSeparator: ' ' }); $('input[data-decimals="1"]').inputmask({ alias: 'numeric', placeholder: '0', groupSeparator: ' ', digits: 1 }); $('input[data-decimals="2"]').inputmask({ alias: 'numeric', placeholder: '0', groupSeparator: ' ', digits: 2 }); $('input[data-decimals="3"]').inputmask({ alias: 'numeric', placeholder: '0', groupSeparator: ' ', digits: 3 }); $('input[data-decimals="4"]').inputmask({ alias: 'numeric', placeholder: '0', groupSeparator: ' ', digits: 4 }); $('input.number:not([data-decimals]):not([data-digits])').inputmask({ alias: 'numeric', placeholder: '', groupSeparator: ' '}); $('input[data-digits="2"]').inputmask({ alias: 'currency', placeholder: '0', groupSeparator: ' ', digits: 2, digitsOptional: false }); $('input[data-digits="4"]').inputmask({ alias: 'currency', placeholder: '0', groupSeparator: ' ', digits: 4, digitsOptional: false }); } $(() => { setDecimals(); }); function populateSelect(select, list, empty = false) { select.empty(); if (empty) select.append(''); list.forEach(option => select.append(``)); } function spinner(show) { if (show) $('#backdrop').addClass('active'); else $('#backdrop').removeClass('active'); } function exportCSV(filename, content) { let body = content.map(s => [].concat(s).join(';')).join('\n'); let blob = new Blob(['\uFEFF', body], {type: 'text/csv;charset=utf-8'}); let link = document.createElement("a"); let url = URL.createObjectURL(blob); link.setAttribute("href", url); link.setAttribute("download", filename); //link.setAttribute("target", "_blank") link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); }