diff options
| author | ivar <i@oiee.no> | 2024-03-19 01:02:22 +0100 |
|---|---|---|
| committer | ivar <i@oiee.no> | 2024-03-19 01:02:22 +0100 |
| commit | 5f604b3052dab1d51dc130df2470bf330b283ec6 (patch) | |
| tree | ae00e1fe4542850467555b4e3af41964ba8d878b /code/api/wwwroot/scripts/helpers.js | |
| parent | 63cf177e8cf22e349534664d59a6926f8b36863d (diff) | |
| download | storage-5f604b3052dab1d51dc130df2470bf330b283ec6.tar.xz storage-5f604b3052dab1d51dc130df2470bf330b283ec6.zip | |
Max lenghts on db schema
Use latest temporal from cdn
Implement majority of translation functionality
Major refinements/bugs
Diffstat (limited to 'code/api/wwwroot/scripts/helpers.js')
| -rw-r--r-- | code/api/wwwroot/scripts/helpers.js | 482 |
1 files changed, 273 insertions, 209 deletions
diff --git a/code/api/wwwroot/scripts/helpers.js b/code/api/wwwroot/scripts/helpers.js index f215863..8d4ded5 100644 --- a/code/api/wwwroot/scripts/helpers.js +++ b/code/api/wwwroot/scripts/helpers.js @@ -1,129 +1,187 @@ function element_has_focus(element) { - return element === document.activeElement; + return element === document.activeElement; +} + +function json_or_default_async(response, defaultValue = undefined) { + try { + return response.json(); + } catch { + return new Promise(resolve => resolve(defaultValue)); + } } function move_focus(element) { - if (!element) { - element = document.getElementsByTagName("body")[0]; - } - element.focus(); - if (!element_has_focus(element)) { - element.setAttribute("tabindex", "-1"); - element.focus(); - } + if (!element) { + element = document.getElementsByTagName("body")[0]; + } + element.focus(); + if (!element_has_focus(element)) { + element.setAttribute("tabindex", "-1"); + element.focus(); + } } function is_promise(p) { - if (typeof p === 'object' && typeof p.then === 'function') { - return true; - } + if (typeof p === "object" && typeof p.then === "function") { + return true; + } - return false; + return false; } function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); + return new Promise(resolve => setTimeout(resolve, ms)); } async function retry(action, predicateOrRetryCount = 4, cooldown = 250) { - let result = undefined; - const maxTries = 1000; - if (typeof predicateOrRetryCount === "number") { - let tries = 0; - if (predicateOrRetryCount > maxTries) throw new Error("Retry count is larger than limit: " + maxTries); - while (!result && tries < predicateOrRetryCount) { - await sleep(cooldown); - result = is_promise(action) ? await action() : action(); - tries++; - } - } - if (typeof predicateOrRetryCount === "function") { - let tries = 0; - while (predicateOrRetryCount(result) === false && tries < maxTries) { - await sleep(cooldown); - result = is_promise(action) ? await action() : action(); - tries++; - } - } - return result; + let result = undefined; + const maxTries = 1000; + if (typeof predicateOrRetryCount === "number") { + let tries = 0; + if (predicateOrRetryCount > maxTries) { + throw new Error("Retry count is larger than limit: " + maxTries); + } + while (!result && tries < predicateOrRetryCount) { + await sleep(cooldown); + result = is_promise(action) ? await action() : action(); + tries++; + } + } + if (typeof predicateOrRetryCount === "function") { + let tries = 0; + while (predicateOrRetryCount(result) === false && tries < maxTries) { + await sleep(cooldown); + result = is_promise(action) ? await action() : action(); + tries++; + } + } + return result; +} + + +function generate_unsafe_id(length) { + if (!length) { + throw new Error("length is undefined"); + } + let result = ""; + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +function pick_file(cb, options = {}) { + const input = create_element("input", { + type: "file", + multiple: options?.multiple ?? null, + accept: options?.accept ?? null, + style: { + display: "none" + }, + onchange: event => { + if (cb && typeof cb === "function") { + cb(input.files); + } + input.remove(); + } + }); + document.body.appendChild(input); + input.click(); } function create_element_from_object(elementOptions) { - return create_element(elementOptions.name, elementOptions.properties, elementOptions.children); + return create_element(elementOptions.name, elementOptions.properties, elementOptions.children); +} + +function style_string(style_object) { + const camelToKebab = (input) => input.replace(/[A-Z]+(?![a-z])|[A-Z]/g, ($, ofs) => (ofs ? "-" : "") + $.toLowerCase()); + const res = Object.keys(style_object).map(property => `${camelToKebab(property)}: ${style_object[property]};`).join("\n"); + return res; } function create_element(name, properties, children) { - if (!name || name.length < 1) { - throw new Error("name is required"); - } - const node = document.createElement(name); - if (properties) { - for (const [key, value] of Object.entries(properties)) { - node[key] = value; - } - } + if (!name || name.length < 1) { + throw new Error("name is required"); + } + const node = document.createElement(name); + for (const [key, value] of Object.entries(properties)) { + if (!value) { + continue; + } + if (key === "style") { + node.style.cssText = style_string(value); + continue; + } + node[key] = value; + } - if (children && children.length > 0) { - let actualChildren = children; - if (typeof children === "function") { - actualChildren = children(); - } - for (const child of actualChildren) { - node.appendChild(child) - } - } - return node; + if (children?.length > 0 ?? false) { + let actualChildren = children; + if (typeof children === "function") { + actualChildren = children(); + } + for (const child of actualChildren) { + node.appendChild(child); + } + } + return node; } // https://stackoverflow.com/a/45215694/11961742 function get_selected_options(domElement) { - const ret = []; + const ret = []; - if (domElement.selectedOptions !== undefined) { - for (let i = 0; i < domElement.selectedOptions.length; i++) { - ret.push(domElement.selectedOptions[i].value); - } - } else { - for (let i = 0; i < domElement.options.length; i++) { - if (domElement.options[i].selected) { - ret.push(domElement.options[i].value); - } - } - } - return ret; + if (domElement.selectedOptions !== undefined) { + for (let i = 0; i < domElement.selectedOptions.length; i++) { + ret.push(domElement.selectedOptions[i].value); + } + } else { + for (let i = 0; i < domElement.options.length; i++) { + if (domElement.options[i].selected) { + ret.push(domElement.options[i].value); + } + } + } + return ret; } function get_element_position(element) { - if (!element) return {x: 0, y: 0}; - let x = 0; - let y = 0; - while (true) { - x += element.offsetLeft; - y += element.offsetTop; - if (element.offsetParent === null) { - break; - } - element = element.offsetParent; - } - return {x, y}; + if (!element) { + return {x: 0, y: 0}; + } + let x = 0; + let y = 0; + while (true) { + x += element.offsetLeft; + y += element.offsetTop; + if (element.offsetParent === null) { + break; + } + element = element.offsetParent; + } + return {x, y}; } function restrict_input_to_numbers(element, specials = [], mergeSpecialsWithDefaults = false) { - if (!element) return; - element.addEventListener("keydown", (e) => { - const defaultSpecials = ["Backspace", "ArrowLeft", "ArrowRight", "Tab"]; - let keys = specials.length > 0 ? specials : defaultSpecials; - if (mergeSpecialsWithDefaults && specials) { - keys = [...specials, ...defaultSpecials]; - } - if (keys.indexOf(e.key) !== -1) { - return; - } - if (isNaN(parseInt(e.key))) { - e.preventDefault(); - } - }); + if (!element) { + return; + } + element.addEventListener("keydown", (e) => { + const defaultSpecials = ["Backspace", "ArrowLeft", "ArrowRight", "Tab"]; + let keys = specials.length > 0 ? specials : defaultSpecials; + if (mergeSpecialsWithDefaults && specials) { + keys = [...specials, ...defaultSpecials]; + } + if (keys.indexOf(e.key) !== -1) { + return; + } + if (isNaN(parseInt(e.key))) { + e.preventDefault(); + } + }); } // A formatted version of a popular md5 implementation. @@ -131,129 +189,135 @@ function restrict_input_to_numbers(element, specials = [], mergeSpecialsWithDefa // The function itself is now 42 lines long. // https://stackoverflow.com/a/60467595 "Don't deny." function get_md5_hash(inputString) { - const hc = "0123456789abcdef"; + const hc = "0123456789abcdef"; - function rh(n) { - var j, s = ""; - for (j = 0; j <= 3; j++) s += hc.charAt((n >> (j * 8 + 4)) & 0x0F) + hc.charAt((n >> (j * 8)) & 0x0F); - return s; - } + function rh(n) { + var j, s = ""; + for (j = 0; j <= 3; j++) { + s += hc.charAt((n >> (j * 8 + 4)) & 0x0F) + hc.charAt((n >> (j * 8)) & 0x0F); + } + return s; + } - function ad(x, y) { - var l = (x & 0xFFFF) + (y & 0xFFFF); - var m = (x >> 16) + (y >> 16) + (l >> 16); - return (m << 16) | (l & 0xFFFF); - } + function ad(x, y) { + var l = (x & 0xFFFF) + (y & 0xFFFF); + var m = (x >> 16) + (y >> 16) + (l >> 16); + return (m << 16) | (l & 0xFFFF); + } - function rl(n, c) { - return (n << c) | (n >>> (32 - c)); - } + function rl(n, c) { + return (n << c) | (n >>> (32 - c)); + } - function cm(q, a, b, x, s, t) { - return ad(rl(ad(ad(a, q), ad(x, t)), s), b); - } + function cm(q, a, b, x, s, t) { + return ad(rl(ad(ad(a, q), ad(x, t)), s), b); + } - function ff(a, b, c, d, x, s, t) { - return cm((b & c) | ((~b) & d), a, b, x, s, t); - } + function ff(a, b, c, d, x, s, t) { + return cm((b & c) | ((~b) & d), a, b, x, s, t); + } - function gg(a, b, c, d, x, s, t) { - return cm((b & d) | (c & (~d)), a, b, x, s, t); - } + function gg(a, b, c, d, x, s, t) { + return cm((b & d) | (c & (~d)), a, b, x, s, t); + } - function hh(a, b, c, d, x, s, t) { - return cm(b ^ c ^ d, a, b, x, s, t); - } + function hh(a, b, c, d, x, s, t) { + return cm(b ^ c ^ d, a, b, x, s, t); + } - function ii(a, b, c, d, x, s, t) { - return cm(c ^ (b | (~d)), a, b, x, s, t); - } + function ii(a, b, c, d, x, s, t) { + return cm(c ^ (b | (~d)), a, b, x, s, t); + } - function sb(x) { - var i; - var nblk = ((x.length + 8) >> 6) + 1; - var blks = new Array(nblk * 16); - for (i = 0; i < nblk * 16; i++) blks[i] = 0; - for (i = 0; i < x.length; i++) blks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8); - blks[i >> 2] |= 0x80 << ((i % 4) * 8); - blks[nblk * 16 - 2] = x.length * 8; - return blks; - } + function sb(x) { + var i; + var nblk = ((x.length + 8) >> 6) + 1; + var blks = new Array(nblk * 16); + for (i = 0; i < nblk * 16; i++) { + blks[i] = 0; + } + for (i = 0; i < x.length; i++) { + blks[i >> 2] |= x.charCodeAt(i) << ((i % 4) * 8); + } + blks[i >> 2] |= 0x80 << ((i % 4) * 8); + blks[nblk * 16 - 2] = x.length * 8; + return blks; + } - var i, x = sb(inputString), a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, olda, oldb, oldc, oldd; - for (i = 0; i < x.length; i += 16) { - olda = a; - oldb = b; - oldc = c; - oldd = d; - a = ff(a, b, c, d, x[i + 0], 7, -680876936); - d = ff(d, a, b, c, x[i + 1], 12, -389564586); - c = ff(c, d, a, b, x[i + 2], 17, 606105819); - b = ff(b, c, d, a, x[i + 3], 22, -1044525330); - a = ff(a, b, c, d, x[i + 4], 7, -176418897); - d = ff(d, a, b, c, x[i + 5], 12, 1200080426); - c = ff(c, d, a, b, x[i + 6], 17, -1473231341); - b = ff(b, c, d, a, x[i + 7], 22, -45705983); - a = ff(a, b, c, d, x[i + 8], 7, 1770035416); - d = ff(d, a, b, c, x[i + 9], 12, -1958414417); - c = ff(c, d, a, b, x[i + 10], 17, -42063); - b = ff(b, c, d, a, x[i + 11], 22, -1990404162); - a = ff(a, b, c, d, x[i + 12], 7, 1804603682); - d = ff(d, a, b, c, x[i + 13], 12, -40341101); - c = ff(c, d, a, b, x[i + 14], 17, -1502002290); - b = ff(b, c, d, a, x[i + 15], 22, 1236535329); - a = gg(a, b, c, d, x[i + 1], 5, -165796510); - d = gg(d, a, b, c, x[i + 6], 9, -1069501632); - c = gg(c, d, a, b, x[i + 11], 14, 643717713); - b = gg(b, c, d, a, x[i + 0], 20, -373897302); - a = gg(a, b, c, d, x[i + 5], 5, -701558691); - d = gg(d, a, b, c, x[i + 10], 9, 38016083); - c = gg(c, d, a, b, x[i + 15], 14, -660478335); - b = gg(b, c, d, a, x[i + 4], 20, -405537848); - a = gg(a, b, c, d, x[i + 9], 5, 568446438); - d = gg(d, a, b, c, x[i + 14], 9, -1019803690); - c = gg(c, d, a, b, x[i + 3], 14, -187363961); - b = gg(b, c, d, a, x[i + 8], 20, 1163531501); - a = gg(a, b, c, d, x[i + 13], 5, -1444681467); - d = gg(d, a, b, c, x[i + 2], 9, -51403784); - c = gg(c, d, a, b, x[i + 7], 14, 1735328473); - b = gg(b, c, d, a, x[i + 12], 20, -1926607734); - a = hh(a, b, c, d, x[i + 5], 4, -378558); - d = hh(d, a, b, c, x[i + 8], 11, -2022574463); - c = hh(c, d, a, b, x[i + 11], 16, 1839030562); - b = hh(b, c, d, a, x[i + 14], 23, -35309556); - a = hh(a, b, c, d, x[i + 1], 4, -1530992060); - d = hh(d, a, b, c, x[i + 4], 11, 1272893353); - c = hh(c, d, a, b, x[i + 7], 16, -155497632); - b = hh(b, c, d, a, x[i + 10], 23, -1094730640); - a = hh(a, b, c, d, x[i + 13], 4, 681279174); - d = hh(d, a, b, c, x[i + 0], 11, -358537222); - c = hh(c, d, a, b, x[i + 3], 16, -722521979); - b = hh(b, c, d, a, x[i + 6], 23, 76029189); - a = hh(a, b, c, d, x[i + 9], 4, -640364487); - d = hh(d, a, b, c, x[i + 12], 11, -421815835); - c = hh(c, d, a, b, x[i + 15], 16, 530742520); - b = hh(b, c, d, a, x[i + 2], 23, -995338651); - a = ii(a, b, c, d, x[i + 0], 6, -198630844); - d = ii(d, a, b, c, x[i + 7], 10, 1126891415); - c = ii(c, d, a, b, x[i + 14], 15, -1416354905); - b = ii(b, c, d, a, x[i + 5], 21, -57434055); - a = ii(a, b, c, d, x[i + 12], 6, 1700485571); - d = ii(d, a, b, c, x[i + 3], 10, -1894986606); - c = ii(c, d, a, b, x[i + 10], 15, -1051523); - b = ii(b, c, d, a, x[i + 1], 21, -2054922799); - a = ii(a, b, c, d, x[i + 8], 6, 1873313359); - d = ii(d, a, b, c, x[i + 15], 10, -30611744); - c = ii(c, d, a, b, x[i + 6], 15, -1560198380); - b = ii(b, c, d, a, x[i + 13], 21, 1309151649); - a = ii(a, b, c, d, x[i + 4], 6, -145523070); - d = ii(d, a, b, c, x[i + 11], 10, -1120210379); - c = ii(c, d, a, b, x[i + 2], 15, 718787259); - b = ii(b, c, d, a, x[i + 9], 21, -343485551); - a = ad(a, olda); - b = ad(b, oldb); - c = ad(c, oldc); - d = ad(d, oldd); - } - return rh(a) + rh(b) + rh(c) + rh(d); -}
\ No newline at end of file + var i, x = sb(inputString), a = 1732584193, b = -271733879, c = -1732584194, d = 271733878, olda, oldb, oldc, oldd; + for (i = 0; i < x.length; i += 16) { + olda = a; + oldb = b; + oldc = c; + oldd = d; + a = ff(a, b, c, d, x[i + 0], 7, -680876936); + d = ff(d, a, b, c, x[i + 1], 12, -389564586); + c = ff(c, d, a, b, x[i + 2], 17, 606105819); + b = ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = ff(a, b, c, d, x[i + 4], 7, -176418897); + d = ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = ff(b, c, d, a, x[i + 7], 22, -45705983); + a = ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = ff(c, d, a, b, x[i + 10], 17, -42063); + b = ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = ff(d, a, b, c, x[i + 13], 12, -40341101); + c = ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = ff(b, c, d, a, x[i + 15], 22, 1236535329); + a = gg(a, b, c, d, x[i + 1], 5, -165796510); + d = gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = gg(c, d, a, b, x[i + 11], 14, 643717713); + b = gg(b, c, d, a, x[i + 0], 20, -373897302); + a = gg(a, b, c, d, x[i + 5], 5, -701558691); + d = gg(d, a, b, c, x[i + 10], 9, 38016083); + c = gg(c, d, a, b, x[i + 15], 14, -660478335); + b = gg(b, c, d, a, x[i + 4], 20, -405537848); + a = gg(a, b, c, d, x[i + 9], 5, 568446438); + d = gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = gg(c, d, a, b, x[i + 3], 14, -187363961); + b = gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = gg(d, a, b, c, x[i + 2], 9, -51403784); + c = gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = gg(b, c, d, a, x[i + 12], 20, -1926607734); + a = hh(a, b, c, d, x[i + 5], 4, -378558); + d = hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = hh(b, c, d, a, x[i + 14], 23, -35309556); + a = hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = hh(c, d, a, b, x[i + 7], 16, -155497632); + b = hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = hh(a, b, c, d, x[i + 13], 4, 681279174); + d = hh(d, a, b, c, x[i + 0], 11, -358537222); + c = hh(c, d, a, b, x[i + 3], 16, -722521979); + b = hh(b, c, d, a, x[i + 6], 23, 76029189); + a = hh(a, b, c, d, x[i + 9], 4, -640364487); + d = hh(d, a, b, c, x[i + 12], 11, -421815835); + c = hh(c, d, a, b, x[i + 15], 16, 530742520); + b = hh(b, c, d, a, x[i + 2], 23, -995338651); + a = ii(a, b, c, d, x[i + 0], 6, -198630844); + d = ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = ii(b, c, d, a, x[i + 5], 21, -57434055); + a = ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = ii(c, d, a, b, x[i + 10], 15, -1051523); + b = ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = ii(d, a, b, c, x[i + 15], 10, -30611744); + c = ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = ii(a, b, c, d, x[i + 4], 6, -145523070); + d = ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = ii(c, d, a, b, x[i + 2], 15, 718787259); + b = ii(b, c, d, a, x[i + 9], 21, -343485551); + a = ad(a, olda); + b = ad(b, oldb); + c = ad(c, oldc); + d = ad(d, oldd); + } + return rh(a) + rh(b) + rh(c) + rh(d); +} |
