diff options
| author | ivarlovlie <git@ivarlovlie.no> | 2022-06-01 21:13:43 +0200 |
|---|---|---|
| committer | ivarlovlie <git@ivarlovlie.no> | 2022-06-01 21:13:43 +0200 |
| commit | 9383a2fb09ffb60cfe63683106945bd688affa59 (patch) | |
| tree | 65b3f4b48841583e355887db5de5a16e7005fc87 /src/wwwroot/scripts/utilities.js | |
| download | vinjesvingenhandel.no-9383a2fb09ffb60cfe63683106945bd688affa59.tar.xz vinjesvingenhandel.no-9383a2fb09ffb60cfe63683106945bd688affa59.zip | |
feat: Initial commit after clean slate
Diffstat (limited to 'src/wwwroot/scripts/utilities.js')
| -rw-r--r-- | src/wwwroot/scripts/utilities.js | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/src/wwwroot/scripts/utilities.js b/src/wwwroot/scripts/utilities.js new file mode 100644 index 0000000..02af8b5 --- /dev/null +++ b/src/wwwroot/scripts/utilities.js @@ -0,0 +1,254 @@ +import {toaster} from "./base"; +import {messages} from "./messages"; + +export const utilites = { + dom: { + restrictInputToNumbers(el, specials, mergeSpecialsWithDefaults) { + el.addEventListener("keydown", e => { + const defaultSpecials = [ + "Backspace", + "ArrowLeft", + "ArrowRight", + "Tab", + ]; + let keys = specials ?? defaultSpecials; + if (mergeSpecialsWithDefaults && specials) keys = [...specials, ...defaultSpecials]; + if (keys.indexOf(e.key) !== -1) { + return; + } + if (isNaN(parseInt(e.key))) { + e.preventDefault(); + } + }); + }, + elementHasFocus: (el) => el === document.activeElement, + moveFocus(element) { + if (!element) element = document.getElementsByTagName("body")[0]; + element.focus(); + if (!this.elementHasFocus(element)) { + element.setAttribute("tabindex", "-1"); + element.focus(); + } + }, + }, + array: { + isEmpty: (arr) => arr === undefined || !Array.isArray(arr) || arr.length <= 0, + removeItemOnce(arr, value) { + const index = arr.indexOf(value); + if (index > -1) { + arr.splice(index, 1); + } + return arr; + }, + pushOrUpdate(arr, obj) { + const index = arr.findIndex((e) => e.id === obj.id); + if (index === -1) { + arr.push(obj); + } else { + arr[index] = obj; + } + }, + removeItemAll(arr, value) { + let i = 0; + while (i < arr.length) { + if (arr[i] === value) { + arr.splice(i, 1); + } else { + ++i; + } + } + return arr; + }, + removeItemByIdAll(arr, value) { + let i = 0; + while (i < arr.length) { + if (arr[i].id === value.id) { + arr.splice(i, 1); + } else { + ++i; + } + } + return arr; + }, + }, + object: { + // http://youmightnotneedjquery.com/#deep_extend + extend(object, ext) { + ext = ext || {}; + for (let i = 1; i < object.length; i++) { + let obj = object[i]; + if (!obj) continue; + for (let key in obj) { + if (obj.hasOwnProperty(key)) { + if (typeof obj[key] === "object") { + if (obj[key] instanceof Array) + ext[key] = obj[key].slice(0); + else + ext[key] = this.extend(ext[key], obj[key]); + } else + ext[key] = obj[key]; + } + } + } + return ext; + }, + isEmptyObj(obj) { + return obj !== undefined && Object.keys(obj).length > 0; + }, + }, + validators: { + isEmail(input) { + const re = /\S+@\S+\.\S+/; + return re.test(input); + }, + }, + getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; + }, + isInternetExplorer() { + const ua = navigator.userAgent; + return ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1; + }, + toReadableDateString(date) { + date.setMinutes(date.getMinutes() - date.getTimezoneOffset()); + return date.toLocaleString("nb-NO"); + }, + toReadableBytes(bytes) { + const s = ["bytes", "kB", "MB", "GB", "TB", "PB"]; + const e = Math.floor(Math.log(bytes) / Math.log(1024)); + return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e]; + }, + toReadablePriceSuffix(suffix) { + switch (suffix) { + case 0: + return ",-"; + case 1: + return ",- kg"; + case 2: + return ",- stk"; + } + }, + setSessionStorageJSON(key, object) { + sessionStorage.setItem(key, JSON.stringify(object)); + }, + getSessionStorageJSON(key) { + const dataString = sessionStorage.getItem(key); + if (dataString === null) return undefined; + return JSON.parse(dataString); + }, + setLocalStorageJSON(key, object) { + localStorage.setItem(key, JSON.stringify(object)); + }, + getLocalStorageJSON(key) { + const dataString = localStorage.getItem(key); + if (dataString === null) return undefined; + return JSON.parse(dataString); + }, + handleError: (httpResult, fallback) => { + if (httpResult.headers !== undefined && httpResult.headers.get("ContentType") === "application/json") { + httpResult.json().then(error => { + console.error(error); + toaster.errorObj(utilites.errorOrDefault(error, fallback)); + }); + } else { + toaster.errorObj(fallback); + } + }, + getOrderStatusName: (status) => { + switch (status) { + case 0: + return "Pågående"; + case 1: + return "Kansellert"; + case 2: + return "Feilet"; + case 3: + return "Fullført"; + case 4: + return "Venter på faktura"; + case 5: + return "Venter på vipps"; + default: + return "Ukjent"; + } + }, + getOrderPaymentName: (status) => { + switch (status) { + case 0: + return "Vipps"; + case 1: + return "Faktura på mail"; + default: + return "Ukjent"; + } + }, + errorOrDefault: (res, fallback) => { + let title; + let message; + + if (res.title) title = res.title; + else if (fallback.title) title = fallback.title; + else title = messages.unknownError.title; + + if (res.message) message = res.message; + else if (fallback.message) message = fallback.message; + else message = messages.unknownError.message; + + return { + title, + message, + }; + }, + // https://stackoverflow.com/a/15757499/11961742 + resolveReferences(json) { + if (typeof json === "string") + json = JSON.parse(json); + + const byid = {}, // all objects by id + refs = []; // references to objects that could not be resolved + json = (function recurse(obj, prop, parent) { + if (typeof obj !== "object" || !obj) // a primitive value + return obj; + if (Object.prototype.toString.call(obj) === "[object Array]") { + for (let i = 0; i < obj.length; i++) { + // check also if the array element is not a primitive value + if (typeof obj[i] !== "object" || !obj[i]) {// a primitive value + continue; + } else if ("$ref" in obj[i]) { + obj[i] = recurse(obj[i], i, obj); + } else { + obj[i] = recurse(obj[i], prop, obj); + } + } + return obj; + } + if ("$ref" in obj) { // a reference + let ref = obj.$ref; + if (ref in byid) + return byid[ref]; + // else we have to make it lazy: + refs.push([parent, prop, ref]); + return; + } else if ("$id" in obj) { + let id = obj.$id; + delete obj.$id; + if ("$values" in obj) // an array + obj = obj.$values.map(recurse); + else // a plain object + for (let prop in obj) + obj[prop] = recurse(obj[prop], prop, obj); + byid[id] = obj; + } + return obj; + })(json); // run it! + + for (let i = 0; i < refs.length; i++) { // resolve previously unknown references + let ref = refs[i]; + ref[0][ref[1]] = byid[ref[2]]; + // Notice that this throws if you put in a reference at top-level + } + return json; + }, +}; |
