@olenbetong/appframe-core 2.7.0 → 2.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../node_modules/mitt/src/index.ts", "../../src/SessionHandler.ts", "../../src/UserSession.ts", "../../src/errorHandler.ts", "../../src/date.ts", "../../src/downloadBlob.ts", "../../src/invariant.ts", "../../src/downloadRequest.ts", "../../src/has.ts", "../../src/parseFunc.ts", "../../src/Namespace.ts", "../../src/requireNamespace.ts", "../../src/expose.ts", "../../src/getUserImage.ts", "../../src/getLocalizedString.ts", "../../src/localize.ts", "../../src/localStorage.ts", "../../src/logActivity.ts", "../../src/settings.ts", "../../src/alert.ts", "../../src/index.ts"],
4
- "sourcesContent": ["export type EventType = string | symbol;\n\n// An event handler can take an optional event argument\n// and should not return a value\nexport type Handler<T = unknown> = (event: T) => void;\nexport type WildcardHandler<T = Record<string, unknown>> = (\n\ttype: keyof T,\n\tevent: T[keyof T]\n) => void;\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>;\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>;\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n\tkeyof Events | '*',\n\tEventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>;\n\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n\tall: EventHandlerMap<Events>;\n\n\ton<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void;\n\ton(type: '*', handler: WildcardHandler<Events>): void;\n\n\toff<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void;\n\toff(type: '*', handler: WildcardHandler<Events>): void;\n\n\temit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n\temit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nexport default function mitt<Events extends Record<EventType, unknown>>(\n\tall?: EventHandlerMap<Events>\n): Emitter<Events> {\n\ttype GenericEventHandler =\n\t\t| Handler<Events[keyof Events]>\n\t\t| WildcardHandler<Events>;\n\tall = all || new Map();\n\n\treturn {\n\n\t\t/**\n\t\t * A Map of event names to registered handler functions.\n\t\t */\n\t\tall,\n\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t * @param {string|symbol} type Type of event to listen for, or `'*'` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n\t\t\tconst handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n\t\t\tif (handlers) {\n\t\t\t\thandlers.push(handler);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tall!.set(type, [handler] as EventHandlerList<Events[keyof Events]>);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t * If `handler` is omitted, all handlers of the given type are removed.\n\t\t * @param {string|symbol} type Type of event to unregister `handler` from, or `'*'`\n\t\t * @param {Function} [handler] Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n\t\t\tconst handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n\t\t\tif (handlers) {\n\t\t\t\tif (handler) {\n\t\t\t\t\thandlers.splice(handlers.indexOf(handler) >>> 0, 1);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tall!.set(type, []);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `'*'` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * Note: Manually firing '*' handlers is not supported.\n\t\t *\n\t\t * @param {string|symbol} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n\t\t\tlet handlers = all!.get(type);\n\t\t\tif (handlers) {\n\t\t\t\t(handlers as EventHandlerList<Events[keyof Events]>)\n\t\t\t\t\t.slice()\n\t\t\t\t\t.map((handler) => {\n\t\t\t\t\t\thandler(evt!);\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\thandlers = all!.get('*');\n\t\t\tif (handlers) {\n\t\t\t\t(handlers as WildCardEventHandlerList<Events>)\n\t\t\t\t\t.slice()\n\t\t\t\t\t.map((handler) => {\n\t\t\t\t\t\thandler(type, evt!);\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n}\n", "import mitt, { Emitter, Handler } from \"mitt\";\n\ntype SessionHandlerEvent = \"onExpired\" | \"onAuthenticated\";\n\nexport default class SessionHandler {\n\tprivate eventHandler: Emitter<{ onAuthenticated: void; onExpired: void }> = mitt();\n\n\tauthenticated() {\n\t\tthis.eventHandler.emit(\"onAuthenticated\");\n\t}\n\n\tasync expired(callback?: () => void, type?: \"RequireTwoFactor\"): Promise<void> {\n\t\ttry {\n\t\t\tlet authPromise = new Promise<void>((resolve) => {\n\t\t\t\tlet eventHandler = () => {\n\t\t\t\t\tthis.eventHandler.off(\"onAuthenticated\", eventHandler);\n\t\t\t\t\tcallback?.();\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tthis.eventHandler.on(\"onAuthenticated\", eventHandler);\n\t\t\t});\n\n\t\t\tlet dialog: HTMLDialogElement | null = document.querySelector(\"dialog.session-expired-dialog\");\n\t\t\tif (!dialog) {\n\t\t\t\tdialog = document.createElement(\"dialog\");\n\t\t\t\tdialog.className = \"session-expired-dialog\";\n\t\t\t\tdialog.style.display = \"flex\";\n\t\t\t\tdialog.style.padding = \"0\";\n\t\t\t\tdialog.style.left = \"50%\";\n\t\t\t\tdialog.style.transform = \"translateX(-50%)\";\n\n\t\t\t\tlet link = \"/login?ReturnUrl=%2fapi/sessionexpired/remove\";\n\t\t\t\tif (type !== \"RequireTwoFactor\") {\n\t\t\t\t\tawait fetch(\"/logout\", { method: \"POST\" });\n\t\t\t\t} else {\n\t\t\t\t\tlink = \"/login?RequireTwoFactor=1&ReturnUrl=%2fapi/sessionexpired/remove\";\n\t\t\t\t}\n\n\t\t\t\tdialog.innerHTML = `<iframe sandbox=\"allow-same-origin allow-scripts allow-modals allow-top-navigation-by-user-activation allow-forms\" src=\"${link}\" style=\"border:0;width:min(500px,100vw);height:min(700px, 100vh);\"></iframe>`;\n\t\t\t\tdocument.body.append(dialog);\n\t\t\t\tdialog.showModal();\n\t\t\t\tawait authPromise;\n\t\t\t\tdialog.remove();\n\t\t\t} else {\n\t\t\t\tawait authPromise;\n\t\t\t}\n\t\t} catch (_) {\n\t\t\twindow.location.href = `/login?ReturnUrl=${encodeURIComponent(window.location.pathname)}${encodeURIComponent(\n\t\t\t\twindow.location.search\n\t\t\t)}`;\n\t\t}\n\t}\n\n\tattachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n\t\treturn this.eventHandler.on(eventName, handler);\n\t}\n\n\tdetachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n\t\treturn this.eventHandler.off(eventName, handler);\n\t}\n}\n", "import SessionHandler from \"./SessionHandler.js\";\n\nexport class UserSession extends SessionHandler {\n\tamDesignator: string = \"a.m.\";\n\tdayNames: string[] = [\"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\"];\n\tdayNamesShort: string[] = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\tdecimalSeparator: string = \".\";\n\tdomain: string = \"OB\";\n\temail: string | null | undefined;\n\tformats: undefined | Record<string, string>;\n\tgroupSeparator: string | null = null;\n\tintegratedSecurity: boolean = false;\n\tisDeveloper: boolean = false;\n\tlogin: string = \"\";\n\tloginType: string | undefined;\n\tmonthNames: string[] = [\n\t\t\"january\",\n\t\t\"february\",\n\t\t\"march\",\n\t\t\"april\",\n\t\t\"may\",\n\t\t\"june\",\n\t\t\"july\",\n\t\t\"august\",\n\t\t\"september\",\n\t\t\"october\",\n\t\t\"november\",\n\t\t\"december\",\n\t\t\"\",\n\t];\n\tmonthNamesShort: string[] = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"augt\", \"sep\", \"oct\", \"nov\", \"dec\", \"\"];\n\tname: string | undefined;\n\tpmDesignator: string = \"p.m.\";\n\tshortDateFormat: string = \"dd.MM.yyyy\";\n\tculture: string = \"en-GB\";\n\tuiculture: string = \"en-GB\";\n\n\tconstructor(userData: any) {\n\t\tsuper();\n\t\tthis.formats = {};\n\t\tObject.assign(this, userData);\n\t}\n}\n", "if (process.env.NODE_ENV === \"production\") {\n\tglobalThis.window?.addEventListener(\"error\", (event) => {\n\t\ttry {\n\t\t\t// Try to avoid error-logging-loop\n\t\t\tconst data = {\n\t\t\t\terror: event.error?.message ?? event.message ?? null,\n\t\t\t\tfile: event.filename,\n\t\t\t\tline: event.lineno ?? 0,\n\t\t\t\tcolumn: event.colno ?? 0,\n\t\t\t\tstack: event.error?.stack ?? null,\n\t\t\t};\n\n\t\t\tfetch(\"/data/Logger/LogError\", {\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\t\"Content-Type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\n\t\t\t\t},\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t} catch (ex) {\n\t\t\t// ignore\n\t\t}\n\t});\n}\n", "export function toLocalISODate(date: Date): string;\nexport function toLocalISODate(date: Date | null): string | null;\nexport function toLocalISODate(date: Date | null): string | null {\n\treturn date ? toLocalISODateTime(date).substring(0, 10) : null;\n}\n\nfunction pad(num: number) {\n\treturn String(num).padStart(2, \"0\");\n}\n\nexport function toLocalISODateTime(date: Date): string;\nexport function toLocalISODateTime(date: Date | null): string | null;\nexport function toLocalISODateTime(date: Date | null): string | null {\n\treturn date\n\t\t? `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(\n\t\t\t\tdate.getMinutes()\n\t\t )}:${pad(date.getSeconds())}.${pad(date.getMilliseconds())}`\n\t\t: null;\n}\n", "export function downloadBlob(blob: Blob | MediaSource, fileName: string) {\n\treturn new Promise<void>(function (resolve, reject) {\n\t\ttry {\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst parent = document.body;\n\t\t\tconst anchor = document.createElement(\"a\");\n\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\tanchor.href = url;\n\t\t\tparent.append(anchor);\n\t\t\tanchor.click();\n\t\t\tparent.removeChild(anchor);\n\n\t\t\tsetTimeout(function () {\n\t\t\t\tURL.revokeObjectURL(url);\n\t\t\t\tresolve();\n\t\t\t}, 250);\n\t\t} catch (ex) {\n\t\t\treject(ex);\n\t\t}\n\t});\n}\n", "export function invariant(condition: any, message?: string | (() => string)): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\tconst provided: string | undefined = typeof message === \"function\" ? message() : message;\n\n\tthrow new Error(provided ?? \"Invariant failed\");\n}\n", "import { downloadBlob } from \"./downloadBlob.js\";\nimport { invariant } from \"./invariant.js\";\n\nexport type DownloadItem = {\n\tstatus: \"cancelled\" | \"error\" | \"requested\" | \"downloading\" | \"downloaded\" | \"completed\";\n\tbytesReceived?: number;\n\terror?: string;\n};\n\nexport type DownloadParameters = {\n\tsignal?: AbortSignal;\n\tfileName: string;\n\tonProgress?: (progress: DownloadItem) => void;\n};\n\nexport async function downloadRequest(request: Request, { fileName, signal, onProgress }: DownloadParameters) {\n\tfunction reportProgress(progress: DownloadItem) {\n\t\tif (typeof onProgress === \"function\") {\n\t\t\tonProgress({ ...progress });\n\t\t}\n\t}\n\n\tlet bytesReceived = 0;\n\n\treportProgress({ status: \"requested\" });\n\n\ttry {\n\t\tlet response = await fetch(request);\n\n\t\tif (!response.ok || !response.body) {\n\t\t\tif (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n\t\t\t\tlet data = await response.json();\n\t\t\t\tinvariant(!data.error, data.error);\n\t\t\t}\n\t\t\tthrow new Error(`${response.status} ${response.statusText}`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tstart: function (controller) {\n\t\t\t\t\tfunction pump(): Promise<void> {\n\t\t\t\t\t\treturn reader.read().then(function (read) {\n\t\t\t\t\t\t\tif (read.done) {\n\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbytesReceived += read.value.length;\n\t\t\t\t\t\t\treportProgress({ bytesReceived, status: \"downloading\" });\n\t\t\t\t\t\t\tcontroller.enqueue(read.value);\n\n\t\t\t\t\t\t\treturn pump();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn pump();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tresponse = new Response(stream);\n\t\t} catch (error) {}\n\n\t\tconst blob = await response.blob();\n\n\t\treportProgress({ bytesReceived, status: \"downloaded\" });\n\n\t\tawait downloadBlob(blob, fileName);\n\n\t\treportProgress({ bytesReceived, status: \"completed\" });\n\t} catch (err) {\n\t\tif (signal?.aborted) {\n\t\t\treportProgress({ status: \"cancelled\" });\n\t\t} else {\n\t\t\treportProgress({ error: (err as Error).message, status: \"error\" });\n\t\t}\n\t}\n}\n", "export function has(obj: any, key: string | number | symbol): boolean {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "import { invariant } from \"./invariant.js\";\n\nconst funcRegex =\n\t/^function(?:\\s+([a-zA-Z$_][a-zA-Z0-9$_]*))?\\s*\\(((?:(?:\\s*[a-zA-Z$_][a-zA-Z0-9$_]*)(?:\\s*,\\s*[a-zA-Z$_][a-zA-Z0-9$_]*)*)?)\\s*\\)\\s*\\{((?:.|\\n|\\r)*)\\}$/;\n\nexport function parseFunc(func: Function) {\n\tvar match = func.toString().match(funcRegex);\n\tinvariant(match, \"Unable to parse function!\");\n\treturn { name: match[1], args: match[2].split(\",\"), body: match[3] };\n}\n", "function Namespace() {}\nNamespace.prototype = Object.create(null);\n\nexport default Namespace;\n", "import Namespace from \"./Namespace.js\";\n\nexport function requireNamespace(root: any, namespace: string | Array<string>): any {\n\tif (typeof root === \"object\") {\n\t\tif (typeof namespace === \"string\") {\n\t\t\tlet path = namespace.split(\".\");\n\n\t\t\treturn requireNamespace(root, path);\n\t\t} else if (Array.isArray(namespace)) {\n\t\t\tlet current: any = root;\n\t\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\t\tcurrent = current[namespace[i]] = current[namespace[i]] || new (Namespace as any)();\n\t\t\t}\n\n\t\t\treturn current;\n\t\t}\n\t}\n}\n", "import { has } from \"./has.js\";\nimport { invariant } from \"./invariant.js\";\nimport { parseFunc } from \"./parseFunc.js\";\nimport { requireNamespace } from \"./requireNamespace.js\";\n\nexport type ExposeOptions = {\n\t/**\n\t * Whether we should overwrite any existing values without warning.\n\t */\n\toverwrite?: boolean;\n};\n\n/**\n * Expose a value to a potentially deeply nested global variable\n * @param name {string | object} Either a dot-separated path to the global variable, or an object to expose the value on\n * @param value {object | Function | Function[]} The value(s) to expose\n */\nexport function expose(\n\tname: object | string,\n\tvalue: object | Function | Function[],\n\toptions: ExposeOptions = {}\n): void {\n\tif (Array.isArray(value)) {\n\t\tfor (let func of value) {\n\t\t\tconst { name: funcName } = parseFunc(func);\n\n\t\t\tinvariant(\n\t\t\t\tfuncName,\n\t\t\t\t\"Unable to detect name of function! Name it, or only supply one function and include name in first parameter.\"\n\t\t\t);\n\t\t\texpose(name, func); // Expose func on namespace found in pName\n\t\t}\n\t} else {\n\t\tlet keyName: string | undefined;\n\t\tlet namespace;\n\n\t\tif (typeof value === \"function\") {\n\t\t\tkeyName = parseFunc(value).name;\n\t\t}\n\n\t\tif (typeof name === \"string\") {\n\t\t\tlet pathParts = name.split(\".\");\n\n\t\t\tif (!keyName) {\n\t\t\t\tkeyName = pathParts[pathParts.length - 1];\n\t\t\t\tpathParts = pathParts.slice(0, pathParts.length - 1);\n\t\t\t}\n\n\t\t\tnamespace = requireNamespace(window, pathParts);\n\t\t} else if (keyName && (typeof name === \"object\" || typeof name === \"function\")) {\n\t\t\tnamespace = name;\n\t\t} else {\n\t\t\tinvariant(false, \"Invalid typeof parameter 'name', or unable to parse pValue!\");\n\t\t}\n\n\t\tif (has(namespace, keyName) && options?.overwrite !== true) {\n\t\t\t// If class is already defined, warn or show an alert\n\t\t\tconsole.warn([name, keyName].join(\".\") + \" is already defined!\");\n\t\t} else {\n\t\t\tnamespace[keyName] = value;\n\t\t}\n\t}\n}\n", "export type ImageSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface getUserImageOptions {\n\t/**\n\t * Prim key of the record in atbl_Personnel_Employees\n\t */\n\tprimKey: string | null;\n\t/**\n\t * Person ID of the employee\n\t */\n\tlogin: string | null;\n\t/**\n\t * The value of the ImageHash column in atbl_Personnel_Employees\n\t */\n\thash: string | number | null;\n\t/**\n\t * The image will be resized according to this value. Default is 'xs':\n\t * - xs: 64px\n\t * - sm: 128px\n\t * - md: 256px\n\t * - lg: 512px\n\t * - xl: image is not resized\n\t */\n\tsize?: ImageSize;\n}\n\nconst sizeMap: Record<ImageSize, number | undefined> = {\n\txs: 64,\n\tsm: 128,\n\tmd: 256,\n\tlg: 512,\n\txl: undefined,\n};\n\n/**\n * Returns the absolute path of a users profile picture. Uses the EmployeesLookup\n * data resource to enable caching across applications.\n *\n * If one of primKey or hash are not provided, or are null, an empty string will be returned.\n */\nexport function getUserImage(\n\tprimKey: string | null,\n\tlogin: string | null,\n\thash: string | number | null,\n\tsize?: ImageSize\n): string;\nexport function getUserImage(options: getUserImageOptions): string;\nexport function getUserImage(\n\tprimKeyOrOptions: string | null | getUserImageOptions,\n\tlogin?: string | null,\n\thash?: string | number | null,\n\tsize: ImageSize = \"xs\"\n) {\n\tif (primKeyOrOptions && typeof primKeyOrOptions === \"object\") {\n\t\treturn getUserImage(primKeyOrOptions.primKey, primKeyOrOptions.login, primKeyOrOptions.hash, primKeyOrOptions.size);\n\t}\n\n\tif (!primKeyOrOptions || !hash) {\n\t\treturn \"\";\n\t}\n\n\tlet sizePx = sizeMap[size];\n\treturn `/api/data/blob/EmployeesLookup/${primKeyOrOptions}/Image/${encodeURIComponent(login ?? \"\")}${\n\t\tlogin ? \".\" : \"\"\n\t}${encodeURIComponent(hash)}.jpg${sizePx ? `?width=${sizePx}` : \"\"}`;\n}\n", "import { has } from \"./has.js\";\n\nasync function fetchLocalizedString(text: string) {\n\ttry {\n\t\tlet response = await fetch(`/api/user/localize/new/${af.article.id}`, {\n\t\t\tbody: JSON.stringify({ text }),\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json; */*\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\n\t\t\t},\n\t\t\tmethod: \"POST\",\n\t\t});\n\n\t\tif (response.ok) {\n\t\t\treturn (await response.json()) as string;\n\t\t}\n\t} catch (error) {}\n\n\treturn text;\n}\nexport function getLocalizedStringAsync(string: undefined | null): undefined | null;\nexport function getLocalizedStringAsync(string: string): Promise<string>;\nexport function getLocalizedStringAsync(string: string | undefined | null) {\n\tif (!string) return string;\n\n\treturn getLocalizedString(string, true);\n}\n\nexport function getLocalizedString(string: undefined | null): undefined | null;\nexport function getLocalizedString(string: string): string;\nexport function getLocalizedString(string: string, wait: false): string;\nexport function getLocalizedString(string: string, wait: true): Promise<string>;\nexport function getLocalizedString(string: undefined | null, wait: true): undefined | null;\nexport function getLocalizedString(\n\tstring: string | undefined | null,\n\twait?: boolean\n): string | undefined | null | Promise<string> {\n\tif (typeof string === \"string\" && string.trim().length === 0) {\n\t\treturn string;\n\t}\n\n\tif (string === undefined || string === \"\" || string === null) {\n\t\treturn;\n\t}\n\n\tif (af?.article?.i18n !== undefined) {\n\t\tif (!has(af.article.i18n, string)) {\n\t\t\taf.article.i18n[string] = string;\n\n\t\t\tlet promise = fetchLocalizedString(string).then((text) => {\n\t\t\t\taf.article.i18n[string] = text;\n\t\t\t\treturn text;\n\t\t\t});\n\n\t\t\tif (wait) {\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t}\n\n\t\treturn af.article.i18n[string];\n\t} else {\n\t\treturn string;\n\t}\n}\n", "import { getLocalizedString } from \"./getLocalizedString.js\";\nimport { invariant } from \"./invariant.js\";\n\n/**\n * Localization function for tagged templates. Replaces the arguments\n * with $n, where n is the index, before asking Appframe to translate\n * the string.\n *\n * For example, if you call localize`Page ${2} or ${5}`, the string\n * \"Page $0 of $1\" will be sent to Appframe, and for norwegian,\n * \"Side 2 av 5\" will be returned.\n *\n * @param stringParts\n * @param args\n * @returns Translated string\n */\nexport function localize(stringParts: TemplateStringsArray, ...args: any[]): string {\n\tinvariant(\n\t\tArray.isArray(stringParts) && stringParts.length === args.length + 1,\n\t\t\"Method 'localize' must be used as a tag function\"\n\t);\n\n\tlet stringToLocalize = stringParts.map((s, i) => (i === stringParts.length - 1 ? s : `${s}\\$${i}`)).join(\"\");\n\tlet localized = getLocalizedString(stringToLocalize);\n\n\targs.forEach((arg, index) => {\n\t\tlocalized = localized.replace(\"$\" + index, arg);\n\t});\n\n\treturn localized;\n}\n", "function getLocalKey(key: string): string {\n\treturn [af?.article?.id || \"\", \"common\", key].join(\".\");\n}\n\nclass LocalStorage {\n\tisPersisted() {\n\t\treturn true;\n\t}\n\n\tgetLocalStorageKey(key: string, global?: boolean) {\n\t\treturn global ? [\"common\", key].join(\".\") : getLocalKey(key);\n\t}\n\n\tget(key: string, defaultValue: unknown, global?: boolean) {\n\t\tconst lsKey = this.getLocalStorageKey(key, global);\n\t\tconst value = localStorage.getItem(lsKey);\n\n\t\treturn value !== null ? JSON.parse(value) : defaultValue;\n\t}\n\n\tset(key: string, value: unknown, global?: boolean) {\n\t\tlocalStorage.setItem(this.getLocalStorageKey(key, global), JSON.stringify(value));\n\t}\n\n\tremove(key: string, global?: boolean) {\n\t\tconst lsKey = this.getLocalStorageKey(key, global);\n\t\tif (localStorage.getItem(lsKey) !== null) {\n\t\t\tlocalStorage.removeItem(lsKey);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclear() {\n\t\tconst baseKey = getLocalKey(\"\");\n\n\t\tfor (let key in localStorage) {\n\t\t\tif (key.slice(0, baseKey.length) === baseKey) {\n\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport default new LocalStorage();\n", "/**\n * Logs an activity to the website activity log\n *\n * @param activity name of the activity we are logging\n * @param parameters A dictionary of parameters used when doing the activity\n * @param timeElapsed Number of milliseconds elapsed while executing\n */\nexport async function logActivity(activity: string, parameters: Record<string, any>, timeElapsed: number = 0) {\n\ttry {\n\t\tlet response = await fetch(\"/api/logging/log-activity\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tarticle: af.article.id,\n\t\t\t\ttimeElapsed,\n\t\t\t\taction: activity,\n\t\t\t\tparameters,\n\t\t\t}),\n\t\t\theaders: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tif (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\t\tlet data = await response.json();\n\t\t\t\tconsole.error(data.error);\n\t\t\t} else {\n\t\t\t\tconsole.error(`${response.status} ${response.statusText}`);\n\t\t\t}\n\t\t}\n\t} catch (error) {}\n}\n\n/**\n * Records the current time, and returns a function that logs the activity with the\n * time elapsed when it is called.\n *\n * @param activity Name of the activity we are logging\n * @param parameters A dictionary of parameters used when doing the activity\n * @returns A function that should be called when the activity is completed to log it to the website log\n */\nexport function startActivity(activity: string, parameters: Record<string, any>) {\n\tlet start = performance.now();\n\treturn () => logActivity(activity, parameters, performance.now() - start);\n}\n", "function getKey(article?: string) {\n\tconst articleKey = article || af.article.id;\n\treturn `${articleKey}.${af.userSession.login}`;\n}\n\nexport function getSettings<T>(setting: string, article?: string): T | null {\n\tif (!af?.userSession) return null;\n\n\tconst key = getKey(article);\n\tconst settings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n\tif (setting) {\n\t\treturn settings[setting] || null;\n\t}\n\n\treturn settings;\n}\n\nexport function saveSettings<T>(setting: string, value: T | null, article?: string): void {\n\tif (!af?.userSession) return;\n\n\tconst key = getKey(article);\n\tlet userSettings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n\tif (typeof value !== \"undefined\") {\n\t\tuserSettings[setting] = value;\n\t} else {\n\t\tuserSettings = setting;\n\t}\n\n\tlocalStorage.setItem(key, JSON.stringify(userSettings));\n}\n", "import { getLocalizedString } from \"./getLocalizedString.js\";\n\nconst template = `\n\t<dialog class=\"alert-dialog\">\n\t\t\t<form method=\"dialog\">\n\t\t\t\t\t<article></article>\n\t\t\t\t\t<footer>\n\t\t\t\t\t\t\t<menu></menu>\n\t\t\t\t\t</footer>\n\t\t\t</form>\n\t</dialog>\n`;\n\nif (globalThis.document && !document.querySelector(\"#AlertDialogTemplate\")) {\n\tlet $template = document.createElement(\"template\");\n\t$template.id = \"AlertDialogTemplate\";\n\t$template.innerHTML = template;\n\tdocument.body.append($template);\n}\n\nexport function waitForDialog(dialog: HTMLDialogElement) {\n\treturn new Promise((resolve) => {\n\t\tdialog.addEventListener(\"close\", resolve, { once: true });\n\t});\n}\n\nexport type AlertDialogButton = {\n\tlabel: string;\n\tvalue: string;\n\tprimary?: boolean;\n};\n\nexport type AlertDialogOptions = {\n\tbuttons: AlertDialogButton[];\n\tcontent: string | HTMLElement;\n\tclassName?: string;\n};\n\nexport async function openAlertDialog({ buttons, content, className }: AlertDialogOptions) {\n\tlet $template = document.querySelector<HTMLTemplateElement>(\"#AlertDialogTemplate\");\n\tif (!$template) throw Error(\"No alert dialog template found\");\n\n\tlet $dialog = $template.content.firstElementChild?.cloneNode(true) as HTMLDialogElement | null;\n\tlet $content = $dialog?.querySelector(\"article\");\n\tlet $menu = $dialog?.querySelector(\"footer menu\");\n\tconsole.log({ $dialog, $content, $menu });\n\tif (!$dialog || !$content || !$menu) throw Error(\"Invalid alert dialog template\");\n\n\tif (className) {\n\t\t$dialog.classList.add(className);\n\t}\n\n\t$content.appendChild(typeof content === \"string\" ? document.createTextNode(content) : content);\n\tfor (let { label, value, primary } of buttons) {\n\t\tlet listItem = document.createElement(\"li\");\n\t\tlet buttonElem = document.createElement(\"button\");\n\t\tbuttonElem.value = value;\n\t\tif (primary) {\n\t\t\tbuttonElem.classList.add(\"primary\");\n\t\t}\n\t\tbuttonElem.textContent = label;\n\t\tlistItem.appendChild(buttonElem);\n\t\t$menu.appendChild(buttonElem);\n\t}\n\n\tdocument.body.appendChild($dialog);\n\t$dialog.showModal();\n\n\tawait waitForDialog($dialog);\n\tlet result = $dialog.returnValue || \"cancel\";\n\tdocument.body.removeChild($dialog);\n\n\treturn result;\n}\n\nexport enum ConfirmButtons {\n\tYesNo,\n\tOkCancel,\n}\n\nexport async function confirm(prompt: string, button: ConfirmButtons = ConfirmButtons.YesNo): Promise<boolean> {\n\tlet buttons: AlertDialogButton[] = [\n\t\t{ label: getLocalizedString(\"No\"), value: \"no\" },\n\t\t{ label: getLocalizedString(\"Yes\"), value: \"yes\", primary: true },\n\t];\n\n\tconsole.log(button);\n\n\tif (button == ConfirmButtons.OkCancel) {\n\t\tbuttons = [\n\t\t\t{ label: getLocalizedString(\"Cancel\"), value: \"no\" },\n\t\t\t{ label: getLocalizedString(\"OK\"), value: \"yes\", primary: true },\n\t\t];\n\t}\n\n\tlet result = await openAlertDialog({ content: prompt, buttons });\n\treturn result === \"yes\";\n}\n\nexport async function alert(prompt: string): Promise<void> {\n\tawait openAlertDialog({\n\t\tcontent: prompt,\n\t\tclassName: \"alert\",\n\t\tbuttons: [{ label: getLocalizedString(\"OK\"), value: \"ok\", primary: true }],\n\t});\n}\n", "import { UserSession } from \"./UserSession.js\";\nimport \"./errorHandler.js\";\nimport { expose } from \"./expose.js\";\nimport { getLocalizedString } from \"./getLocalizedString.js\";\nimport { localize } from \"./localize.js\";\nimport { logActivity, startActivity } from \"./logActivity.js\";\n\nexport { default as mitt } from \"mitt\";\nexport { toLocalISODate, toLocalISODateTime } from \"./date.js\";\nexport { downloadBlob } from \"./downloadBlob.js\";\nexport { downloadRequest } from \"./downloadRequest.js\";\nexport type { DownloadParameters, DownloadItem } from \"./downloadRequest.js\";\nexport { expose } from \"./expose.js\";\nexport { getUserImage } from \"./getUserImage.js\";\nexport type { getUserImageOptions } from \"./getUserImage.js\";\nexport { getLocalizedString } from \"./getLocalizedString.js\";\nexport { has } from \"./has.js\";\nexport { invariant } from \"./invariant.js\";\nexport { localize } from \"./localize.js\";\nexport { default as localStorage } from \"./localStorage.js\";\nexport { logActivity, startActivity } from \"./logActivity.js\";\nexport { default as SessionHandler } from \"./SessionHandler.js\";\nexport { UserSession };\nexport { getSettings, saveSettings } from \"./settings.js\";\nexport { alert, confirm, ConfirmButtons, openAlertDialog, waitForDialog } from \"./alert.js\";\nexport type { AlertDialogButton, AlertDialogOptions } from \"./alert.js\";\n\nexport const version = __VERSION__;\n\ndeclare global {\n\tvar __VERSION__: string;\n\tvar __DEV__: number;\n\tvar af: AfCore;\n\n\tinterface Window {\n\t\taf: AfCore;\n\t}\n}\n\nexport interface AfArticle {\n\thostName: string;\n\ti18n: Record<string, string>;\n\tid: string;\n}\n\nexport interface AfCore {\n\tarticle: AfArticle;\n\tcommon: {\n\t\tgetLocalizedString: typeof getLocalizedString;\n\t\texpose: typeof expose;\n\t\tlocalize: typeof localize;\n\t\tlogActivity: typeof logActivity;\n\t\tstartActivity: typeof startActivity;\n\t};\n\tcontrols?: {\n\t\talert?: (message: string, callback?: () => void) => void;\n\t\tconfirm?: (options: {\n\t\t\ttitle: string;\n\t\t\tmessage: string;\n\t\t\tbuttons: string[];\n\t\t\tcallback: (button: number) => void;\n\t\t}) => void;\n\t};\n\tuserSession: UserSession;\n}\n"],
5
- "mappings": "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",
6
- "names": ["all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "SessionHandler", "mitt_default", "callback", "type", "authPromise", "resolve", "eventHandler", "dialog", "link", "eventName", "handler", "UserSession", "SessionHandler", "userData", "event", "data", "toLocalISODate", "date", "toLocalISODateTime", "pad", "num", "downloadBlob", "blob", "fileName", "resolve", "reject", "url", "parent", "anchor", "ex", "invariant", "condition", "message", "provided", "downloadRequest", "request", "fileName", "signal", "onProgress", "reportProgress", "progress", "bytesReceived", "response", "data", "invariant", "reader", "stream", "controller", "pump", "read", "blob", "downloadBlob", "err", "has", "obj", "key", "funcRegex", "parseFunc", "func", "match", "invariant", "Namespace", "Namespace_default", "requireNamespace", "root", "namespace", "path", "current", "i", "Namespace_default", "expose", "name", "value", "options", "func", "funcName", "parseFunc", "invariant", "keyName", "namespace", "pathParts", "requireNamespace", "has", "sizeMap", "getUserImage", "primKeyOrOptions", "login", "hash", "size", "sizePx", "fetchLocalizedString", "text", "response", "getLocalizedString", "string", "wait", "has", "promise", "fetchLocalizedString", "text", "localize", "stringParts", "args", "invariant", "stringToLocalize", "s", "localized", "getLocalizedString", "arg", "index", "getLocalKey", "key", "LocalStorage", "global", "defaultValue", "lsKey", "value", "baseKey", "localStorage_default", "logActivity", "activity", "parameters", "timeElapsed", "response", "data", "startActivity", "start", "getKey", "article", "getSettings", "setting", "key", "settings", "saveSettings", "value", "userSettings", "template", "$template", "waitForDialog", "dialog", "resolve", "openAlertDialog", "buttons", "content", "className", "$dialog", "$content", "$menu", "label", "value", "primary", "listItem", "buttonElem", "result", "ConfirmButtons", "confirm", "prompt", "button", "getLocalizedString", "alert", "version"]
4
+ "sourcesContent": ["export type EventType = string | symbol;\n\n// An event handler can take an optional event argument\n// and should not return a value\nexport type Handler<T = unknown> = (event: T) => void;\nexport type WildcardHandler<T = Record<string, unknown>> = (\n\ttype: keyof T,\n\tevent: T[keyof T]\n) => void;\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>;\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>;\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n\tkeyof Events | '*',\n\tEventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>;\n\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n\tall: EventHandlerMap<Events>;\n\n\ton<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>): void;\n\ton(type: '*', handler: WildcardHandler<Events>): void;\n\n\toff<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>): void;\n\toff(type: '*', handler: WildcardHandler<Events>): void;\n\n\temit<Key extends keyof Events>(type: Key, event: Events[Key]): void;\n\temit<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never): void;\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nexport default function mitt<Events extends Record<EventType, unknown>>(\n\tall?: EventHandlerMap<Events>\n): Emitter<Events> {\n\ttype GenericEventHandler =\n\t\t| Handler<Events[keyof Events]>\n\t\t| WildcardHandler<Events>;\n\tall = all || new Map();\n\n\treturn {\n\n\t\t/**\n\t\t * A Map of event names to registered handler functions.\n\t\t */\n\t\tall,\n\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t * @param {string|symbol} type Type of event to listen for, or `'*'` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n\t\t\tconst handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n\t\t\tif (handlers) {\n\t\t\t\thandlers.push(handler);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tall!.set(type, [handler] as EventHandlerList<Events[keyof Events]>);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t * If `handler` is omitted, all handlers of the given type are removed.\n\t\t * @param {string|symbol} type Type of event to unregister `handler` from, or `'*'`\n\t\t * @param {Function} [handler] Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n\t\t\tconst handlers: Array<GenericEventHandler> | undefined = all!.get(type);\n\t\t\tif (handlers) {\n\t\t\t\tif (handler) {\n\t\t\t\t\thandlers.splice(handlers.indexOf(handler) >>> 0, 1);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tall!.set(type, []);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `'*'` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * Note: Manually firing '*' handlers is not supported.\n\t\t *\n\t\t * @param {string|symbol} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n\t\t\tlet handlers = all!.get(type);\n\t\t\tif (handlers) {\n\t\t\t\t(handlers as EventHandlerList<Events[keyof Events]>)\n\t\t\t\t\t.slice()\n\t\t\t\t\t.map((handler) => {\n\t\t\t\t\t\thandler(evt!);\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\thandlers = all!.get('*');\n\t\t\tif (handlers) {\n\t\t\t\t(handlers as WildCardEventHandlerList<Events>)\n\t\t\t\t\t.slice()\n\t\t\t\t\t.map((handler) => {\n\t\t\t\t\t\thandler(type, evt!);\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n}\n", "import mitt, { Emitter, Handler } from \"mitt\";\n\ntype SessionHandlerEvent = \"onExpired\" | \"onAuthenticated\";\n\nexport default class SessionHandler {\n\tprivate eventHandler: Emitter<{ onAuthenticated: void; onExpired: void }> = mitt();\n\n\tauthenticated() {\n\t\tthis.eventHandler.emit(\"onAuthenticated\");\n\t}\n\n\tasync expired(callback?: () => void, type?: \"RequireTwoFactor\"): Promise<void> {\n\t\ttry {\n\t\t\tlet authPromise = new Promise<void>((resolve) => {\n\t\t\t\tlet eventHandler = () => {\n\t\t\t\t\tthis.eventHandler.off(\"onAuthenticated\", eventHandler);\n\t\t\t\t\tcallback?.();\n\t\t\t\t\tresolve();\n\t\t\t\t};\n\n\t\t\t\tthis.eventHandler.on(\"onAuthenticated\", eventHandler);\n\t\t\t});\n\n\t\t\tlet dialog: HTMLDialogElement | null = document.querySelector(\"dialog.session-expired-dialog\");\n\t\t\tif (!dialog) {\n\t\t\t\tdialog = document.createElement(\"dialog\");\n\t\t\t\tdialog.className = \"session-expired-dialog\";\n\t\t\t\tdialog.style.display = \"flex\";\n\t\t\t\tdialog.style.padding = \"0\";\n\t\t\t\tdialog.style.left = \"50%\";\n\t\t\t\tdialog.style.transform = \"translateX(-50%)\";\n\n\t\t\t\tlet link = \"/login?ReturnUrl=%2fapi/sessionexpired/remove\";\n\t\t\t\tif (type !== \"RequireTwoFactor\") {\n\t\t\t\t\tawait fetch(\"/logout\", { method: \"POST\" });\n\t\t\t\t} else {\n\t\t\t\t\tlink = \"/login?RequireTwoFactor=1&ReturnUrl=%2fapi/sessionexpired/remove\";\n\t\t\t\t}\n\n\t\t\t\tdialog.innerHTML = `<iframe sandbox=\"allow-same-origin allow-scripts allow-modals allow-top-navigation-by-user-activation allow-forms\" src=\"${link}\" style=\"border:0;width:min(500px,100vw);height:min(700px, 100vh);\"></iframe>`;\n\t\t\t\tdocument.body.append(dialog);\n\t\t\t\tdialog.showModal();\n\t\t\t\tawait authPromise;\n\t\t\t\tdialog.remove();\n\t\t\t} else {\n\t\t\t\tawait authPromise;\n\t\t\t}\n\t\t} catch (_) {\n\t\t\twindow.location.href = `/login?ReturnUrl=${encodeURIComponent(window.location.pathname)}${encodeURIComponent(\n\t\t\t\twindow.location.search\n\t\t\t)}`;\n\t\t}\n\t}\n\n\tattachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n\t\treturn this.eventHandler.on(eventName, handler);\n\t}\n\n\tdetachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n\t\treturn this.eventHandler.off(eventName, handler);\n\t}\n}\n", "import SessionHandler from \"./SessionHandler.js\";\n\nexport class UserSession extends SessionHandler {\n\tamDesignator: string = \"a.m.\";\n\tdayNames: string[] = [\"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\"];\n\tdayNamesShort: string[] = [\"sun\", \"mon\", \"tue\", \"wed\", \"thu\", \"fri\", \"sat\"];\n\tdecimalSeparator: string = \".\";\n\tdomain: string = \"OB\";\n\temail: string | null | undefined;\n\tformats: undefined | Record<string, string>;\n\tgroupSeparator: string | null = null;\n\tintegratedSecurity: boolean = false;\n\tisDeveloper: boolean = false;\n\tlogin: string = \"\";\n\tloginType: string | undefined;\n\tmonthNames: string[] = [\n\t\t\"january\",\n\t\t\"february\",\n\t\t\"march\",\n\t\t\"april\",\n\t\t\"may\",\n\t\t\"june\",\n\t\t\"july\",\n\t\t\"august\",\n\t\t\"september\",\n\t\t\"october\",\n\t\t\"november\",\n\t\t\"december\",\n\t\t\"\",\n\t];\n\tmonthNamesShort: string[] = [\"jan\", \"feb\", \"mar\", \"apr\", \"may\", \"jun\", \"jul\", \"augt\", \"sep\", \"oct\", \"nov\", \"dec\", \"\"];\n\tname: string | undefined;\n\tpmDesignator: string = \"p.m.\";\n\tshortDateFormat: string = \"dd.MM.yyyy\";\n\tculture: string = \"en-GB\";\n\tuiculture: string = \"en-GB\";\n\n\tconstructor(userData: any) {\n\t\tsuper();\n\t\tthis.formats = {};\n\t\tObject.assign(this, userData);\n\t}\n}\n", "if (process.env.NODE_ENV === \"production\") {\n\tglobalThis.window?.addEventListener(\"error\", (event) => {\n\t\ttry {\n\t\t\t// Try to avoid error-logging-loop\n\t\t\tconst data = {\n\t\t\t\terror: event.error?.message ?? event.message ?? null,\n\t\t\t\tfile: event.filename,\n\t\t\t\tline: event.lineno ?? 0,\n\t\t\t\tcolumn: event.colno ?? 0,\n\t\t\t\tstack: event.error?.stack ?? null,\n\t\t\t};\n\n\t\t\tfetch(\"/data/Logger/LogError\", {\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"application/json\",\n\t\t\t\t\t\"Content-Type\": \"application/json; charset=utf-8\",\n\t\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\n\t\t\t\t},\n\t\t\t\tmethod: \"POST\",\n\t\t\t});\n\t\t} catch (ex) {\n\t\t\t// ignore\n\t\t}\n\t});\n}\n", "export function toLocalISODate(date: Date): string;\nexport function toLocalISODate(date: Date | null): string | null;\nexport function toLocalISODate(date: Date | null): string | null {\n\treturn date ? toLocalISODateTime(date).substring(0, 10) : null;\n}\n\nfunction pad(num: number) {\n\treturn String(num).padStart(2, \"0\");\n}\n\nexport function toLocalISODateTime(date: Date): string;\nexport function toLocalISODateTime(date: Date | null): string | null;\nexport function toLocalISODateTime(date: Date | null): string | null {\n\treturn date\n\t\t? `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(\n\t\t\t\tdate.getMinutes()\n\t\t )}:${pad(date.getSeconds())}.${pad(date.getMilliseconds())}`\n\t\t: null;\n}\n", "export function downloadBlob(blob: Blob | MediaSource, fileName: string) {\n\treturn new Promise<void>(function (resolve, reject) {\n\t\ttry {\n\t\t\tconst url = URL.createObjectURL(blob);\n\t\t\tconst parent = document.body;\n\t\t\tconst anchor = document.createElement(\"a\");\n\t\t\tanchor.setAttribute(\"download\", fileName);\n\t\t\tanchor.href = url;\n\t\t\tparent.append(anchor);\n\t\t\tanchor.click();\n\t\t\tparent.removeChild(anchor);\n\n\t\t\tsetTimeout(function () {\n\t\t\t\tURL.revokeObjectURL(url);\n\t\t\t\tresolve();\n\t\t\t}, 250);\n\t\t} catch (ex) {\n\t\t\treject(ex);\n\t\t}\n\t});\n}\n", "export function invariant(condition: any, message?: string | (() => string)): asserts condition {\n\tif (condition) {\n\t\treturn;\n\t}\n\tconst provided: string | undefined = typeof message === \"function\" ? message() : message;\n\n\tthrow new Error(provided ?? \"Invariant failed\");\n}\n", "import { downloadBlob } from \"./downloadBlob.js\";\nimport { invariant } from \"./invariant.js\";\n\nexport type DownloadItem = {\n\tstatus: \"cancelled\" | \"error\" | \"requested\" | \"downloading\" | \"downloaded\" | \"completed\";\n\tbytesReceived?: number;\n\terror?: string;\n};\n\nexport type DownloadParameters = {\n\tsignal?: AbortSignal;\n\tfileName: string;\n\tonProgress?: (progress: DownloadItem) => void;\n};\n\nexport async function downloadRequest(request: Request, { fileName, signal, onProgress }: DownloadParameters) {\n\tfunction reportProgress(progress: DownloadItem) {\n\t\tif (typeof onProgress === \"function\") {\n\t\t\tonProgress({ ...progress });\n\t\t}\n\t}\n\n\tlet bytesReceived = 0;\n\n\treportProgress({ status: \"requested\" });\n\n\ttry {\n\t\tlet response = await fetch(request);\n\n\t\tif (!response.ok || !response.body) {\n\t\t\tif (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n\t\t\t\tlet data = await response.json();\n\t\t\t\tinvariant(!data.error, data.error);\n\t\t\t}\n\t\t\tthrow new Error(`${response.status} ${response.statusText}`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst stream = new ReadableStream({\n\t\t\t\tstart: function (controller) {\n\t\t\t\t\tfunction pump(): Promise<void> {\n\t\t\t\t\t\treturn reader.read().then(function (read) {\n\t\t\t\t\t\t\tif (read.done) {\n\t\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbytesReceived += read.value.length;\n\t\t\t\t\t\t\treportProgress({ bytesReceived, status: \"downloading\" });\n\t\t\t\t\t\t\tcontroller.enqueue(read.value);\n\n\t\t\t\t\t\t\treturn pump();\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn pump();\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tresponse = new Response(stream);\n\t\t} catch (error) {}\n\n\t\tconst blob = await response.blob();\n\n\t\treportProgress({ bytesReceived, status: \"downloaded\" });\n\n\t\tawait downloadBlob(blob, fileName);\n\n\t\treportProgress({ bytesReceived, status: \"completed\" });\n\t} catch (err) {\n\t\tif (signal?.aborted) {\n\t\t\treportProgress({ status: \"cancelled\" });\n\t\t} else {\n\t\t\treportProgress({ error: (err as Error).message, status: \"error\" });\n\t\t}\n\t}\n}\n", "export function has(obj: any, key: string | number | symbol): boolean {\n\treturn Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "import { invariant } from \"./invariant.js\";\n\nconst funcRegex =\n\t/^function(?:\\s+([a-zA-Z$_][a-zA-Z0-9$_]*))?\\s*\\(((?:(?:\\s*[a-zA-Z$_][a-zA-Z0-9$_]*)(?:\\s*,\\s*[a-zA-Z$_][a-zA-Z0-9$_]*)*)?)\\s*\\)\\s*\\{((?:.|\\n|\\r)*)\\}$/;\n\nexport function parseFunc(func: Function) {\n\tvar match = func.toString().match(funcRegex);\n\tinvariant(match, \"Unable to parse function!\");\n\treturn { name: match[1], args: match[2].split(\",\"), body: match[3] };\n}\n", "function Namespace() {}\nNamespace.prototype = Object.create(null);\n\nexport default Namespace;\n", "import Namespace from \"./Namespace.js\";\n\nexport function requireNamespace(root: any, namespace: string | Array<string>): any {\n\tif (typeof root === \"object\") {\n\t\tif (typeof namespace === \"string\") {\n\t\t\tlet path = namespace.split(\".\");\n\n\t\t\treturn requireNamespace(root, path);\n\t\t} else if (Array.isArray(namespace)) {\n\t\t\tlet current: any = root;\n\t\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\t\tcurrent = current[namespace[i]] = current[namespace[i]] || new (Namespace as any)();\n\t\t\t}\n\n\t\t\treturn current;\n\t\t}\n\t}\n}\n", "import { has } from \"./has.js\";\nimport { invariant } from \"./invariant.js\";\nimport { parseFunc } from \"./parseFunc.js\";\nimport { requireNamespace } from \"./requireNamespace.js\";\n\nexport type ExposeOptions = {\n\t/**\n\t * Whether we should overwrite any existing values without warning.\n\t */\n\toverwrite?: boolean;\n};\n\n/**\n * Expose a value to a potentially deeply nested global variable\n * @param name {string | object} Either a dot-separated path to the global variable, or an object to expose the value on\n * @param value {object | Function | Function[]} The value(s) to expose\n */\nexport function expose(\n\tname: object | string,\n\tvalue: object | Function | Function[],\n\toptions: ExposeOptions = {}\n): void {\n\tif (Array.isArray(value)) {\n\t\tfor (let func of value) {\n\t\t\tconst { name: funcName } = parseFunc(func);\n\n\t\t\tinvariant(\n\t\t\t\tfuncName,\n\t\t\t\t\"Unable to detect name of function! Name it, or only supply one function and include name in first parameter.\"\n\t\t\t);\n\t\t\texpose(name, func); // Expose func on namespace found in pName\n\t\t}\n\t} else {\n\t\tlet keyName: string | undefined;\n\t\tlet namespace;\n\n\t\tif (typeof value === \"function\") {\n\t\t\tkeyName = parseFunc(value).name;\n\t\t}\n\n\t\tif (typeof name === \"string\") {\n\t\t\tlet pathParts = name.split(\".\");\n\n\t\t\tif (!keyName) {\n\t\t\t\tkeyName = pathParts[pathParts.length - 1];\n\t\t\t\tpathParts = pathParts.slice(0, pathParts.length - 1);\n\t\t\t}\n\n\t\t\tnamespace = requireNamespace(window, pathParts);\n\t\t} else if (keyName && (typeof name === \"object\" || typeof name === \"function\")) {\n\t\t\tnamespace = name;\n\t\t} else {\n\t\t\tinvariant(false, \"Invalid typeof parameter 'name', or unable to parse pValue!\");\n\t\t}\n\n\t\tif (has(namespace, keyName) && options?.overwrite !== true) {\n\t\t\t// If class is already defined, warn or show an alert\n\t\t\tconsole.warn([name, keyName].join(\".\") + \" is already defined!\");\n\t\t} else {\n\t\t\tnamespace[keyName] = value;\n\t\t}\n\t}\n}\n", "export type ImageSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\nexport interface getUserImageOptions {\n\t/**\n\t * Prim key of the record in atbl_Personnel_Employees\n\t */\n\tprimKey: string | null;\n\t/**\n\t * Person ID of the employee\n\t */\n\tlogin: string | null;\n\t/**\n\t * The value of the ImageHash column in atbl_Personnel_Employees\n\t */\n\thash: string | number | null;\n\t/**\n\t * The image will be resized according to this value. Default is 'xs':\n\t * - xs: 64px\n\t * - sm: 128px\n\t * - md: 256px\n\t * - lg: 512px\n\t * - xl: image is not resized\n\t */\n\tsize?: ImageSize;\n}\n\nconst sizeMap: Record<ImageSize, number | undefined> = {\n\txs: 64,\n\tsm: 128,\n\tmd: 256,\n\tlg: 512,\n\txl: undefined,\n};\n\n/**\n * Returns the absolute path of a users profile picture. Uses the EmployeesLookup\n * data resource to enable caching across applications.\n *\n * If one of primKey or hash are not provided, or are null, an empty string will be returned.\n */\nexport function getUserImage(\n\tprimKey: string | null,\n\tlogin: string | null,\n\thash: string | number | null,\n\tsize?: ImageSize\n): string;\nexport function getUserImage(options: getUserImageOptions): string;\nexport function getUserImage(\n\tprimKeyOrOptions: string | null | getUserImageOptions,\n\tlogin?: string | null,\n\thash?: string | number | null,\n\tsize: ImageSize = \"xs\"\n) {\n\tif (primKeyOrOptions && typeof primKeyOrOptions === \"object\") {\n\t\treturn getUserImage(primKeyOrOptions.primKey, primKeyOrOptions.login, primKeyOrOptions.hash, primKeyOrOptions.size);\n\t}\n\n\tif (!primKeyOrOptions || !hash) {\n\t\treturn \"\";\n\t}\n\n\tlet sizePx = sizeMap[size];\n\treturn `/api/data/blob/EmployeesLookup/${primKeyOrOptions}/Image/${encodeURIComponent(login ?? \"\")}${\n\t\tlogin ? \".\" : \"\"\n\t}${encodeURIComponent(hash)}.jpg${sizePx ? `?width=${sizePx}` : \"\"}`;\n}\n", "import { has } from \"./has.js\";\n\nasync function fetchLocalizedString(text: string) {\n\ttry {\n\t\tlet response = await fetch(`/api/user/localize/new/${af.article.id}`, {\n\t\t\tbody: JSON.stringify({ text }),\n\t\t\theaders: {\n\t\t\t\tAccept: \"application/json; */*\",\n\t\t\t\t\"Content-Type\": \"application/json\",\n\t\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\n\t\t\t},\n\t\t\tmethod: \"POST\",\n\t\t});\n\n\t\tif (response.ok) {\n\t\t\treturn (await response.json()) as string;\n\t\t}\n\t} catch (error) {}\n\n\treturn text;\n}\nexport function getLocalizedStringAsync(string: undefined | null): undefined | null;\nexport function getLocalizedStringAsync(string: string): Promise<string>;\nexport function getLocalizedStringAsync(string: string | undefined | null) {\n\tif (!string) return string;\n\n\treturn getLocalizedString(string, true);\n}\n\nexport function getLocalizedString(string: undefined | null): undefined | null;\nexport function getLocalizedString(string: string): string;\nexport function getLocalizedString(string: string, wait: false): string;\nexport function getLocalizedString(string: string, wait: true): Promise<string>;\nexport function getLocalizedString(string: undefined | null, wait: true): undefined | null;\nexport function getLocalizedString(\n\tstring: string | undefined | null,\n\twait?: boolean\n): string | undefined | null | Promise<string> {\n\tif (typeof string === \"string\" && string.trim().length === 0) {\n\t\treturn string;\n\t}\n\n\tif (string === undefined || string === \"\" || string === null) {\n\t\treturn;\n\t}\n\n\tif (af?.article?.i18n !== undefined) {\n\t\tif (!has(af.article.i18n, string)) {\n\t\t\taf.article.i18n[string] = string;\n\n\t\t\tlet promise = fetchLocalizedString(string).then((text) => {\n\t\t\t\taf.article.i18n[string] = text;\n\t\t\t\treturn text;\n\t\t\t});\n\n\t\t\tif (wait) {\n\t\t\t\treturn promise;\n\t\t\t}\n\t\t}\n\n\t\treturn af.article.i18n[string];\n\t} else {\n\t\treturn string;\n\t}\n}\n", "import { getLocalizedString } from \"./getLocalizedString.js\";\nimport { invariant } from \"./invariant.js\";\n\n/**\n * Localization function for tagged templates. Replaces the arguments\n * with $n, where n is the index, before asking Appframe to translate\n * the string.\n *\n * For example, if you call localize`Page ${2} or ${5}`, the string\n * \"Page $0 of $1\" will be sent to Appframe, and for norwegian,\n * \"Side 2 av 5\" will be returned.\n *\n * @param stringParts\n * @param args\n * @returns Translated string\n */\nexport function localize(stringParts: TemplateStringsArray, ...args: any[]): string {\n\tinvariant(\n\t\tArray.isArray(stringParts) && stringParts.length === args.length + 1,\n\t\t\"Method 'localize' must be used as a tag function\"\n\t);\n\n\tlet stringToLocalize = stringParts.map((s, i) => (i === stringParts.length - 1 ? s : `${s}\\$${i}`)).join(\"\");\n\tlet localized = getLocalizedString(stringToLocalize);\n\n\targs.forEach((arg, index) => {\n\t\tlocalized = localized.replace(\"$\" + index, arg);\n\t});\n\n\treturn localized;\n}\n", "function getLocalKey(key: string): string {\n\treturn [af?.article?.id || \"\", \"common\", key].join(\".\");\n}\n\nclass LocalStorage {\n\tisPersisted() {\n\t\treturn true;\n\t}\n\n\tgetLocalStorageKey(key: string, global?: boolean) {\n\t\treturn global ? [\"common\", key].join(\".\") : getLocalKey(key);\n\t}\n\n\tget(key: string, defaultValue: unknown, global?: boolean) {\n\t\tconst lsKey = this.getLocalStorageKey(key, global);\n\t\tconst value = localStorage.getItem(lsKey);\n\n\t\treturn value !== null ? JSON.parse(value) : defaultValue;\n\t}\n\n\tset(key: string, value: unknown, global?: boolean) {\n\t\tlocalStorage.setItem(this.getLocalStorageKey(key, global), JSON.stringify(value));\n\t}\n\n\tremove(key: string, global?: boolean) {\n\t\tconst lsKey = this.getLocalStorageKey(key, global);\n\t\tif (localStorage.getItem(lsKey) !== null) {\n\t\t\tlocalStorage.removeItem(lsKey);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclear() {\n\t\tconst baseKey = getLocalKey(\"\");\n\n\t\tfor (let key in localStorage) {\n\t\t\tif (key.slice(0, baseKey.length) === baseKey) {\n\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport default new LocalStorage();\n", "/**\n * Logs an activity to the website activity log\n *\n * @param activity name of the activity we are logging\n * @param parameters A dictionary of parameters used when doing the activity\n * @param timeElapsed Number of milliseconds elapsed while executing\n */\nexport async function logActivity(activity: string, parameters: Record<string, any>, timeElapsed: number = 0) {\n\ttry {\n\t\tlet response = await fetch(\"/api/logging/log-activity\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tarticle: af.article.id,\n\t\t\t\ttimeElapsed,\n\t\t\t\taction: activity,\n\t\t\t\tparameters,\n\t\t\t}),\n\t\t\theaders: { \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n\t\t});\n\n\t\tif (!response.ok) {\n\t\t\tif (response.headers.get(\"Content-Type\")?.includes(\"application/json\")) {\n\t\t\t\tlet data = await response.json();\n\t\t\t\tconsole.error(data.error);\n\t\t\t} else {\n\t\t\t\tconsole.error(`${response.status} ${response.statusText}`);\n\t\t\t}\n\t\t}\n\t} catch (error) {}\n}\n\n/**\n * Records the current time, and returns a function that logs the activity with the\n * time elapsed when it is called.\n *\n * @param activity Name of the activity we are logging\n * @param parameters A dictionary of parameters used when doing the activity\n * @returns A function that should be called when the activity is completed to log it to the website log\n */\nexport function startActivity(activity: string, parameters: Record<string, any>) {\n\tlet start = performance.now();\n\treturn () => logActivity(activity, parameters, performance.now() - start);\n}\n", "function getKey(article?: string) {\n\tconst articleKey = article || af.article.id;\n\treturn `${articleKey}.${af.userSession.login}`;\n}\n\nexport function getSettings<T>(setting: string, article?: string): T | null {\n\tif (!af?.userSession) return null;\n\n\tconst key = getKey(article);\n\tconst settings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n\tif (setting) {\n\t\treturn settings[setting] || null;\n\t}\n\n\treturn settings;\n}\n\nexport function saveSettings<T>(setting: string, value: T | null, article?: string): void {\n\tif (!af?.userSession) return;\n\n\tconst key = getKey(article);\n\tlet userSettings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n\tif (typeof value !== \"undefined\") {\n\t\tuserSettings[setting] = value;\n\t} else {\n\t\tuserSettings = setting;\n\t}\n\n\tlocalStorage.setItem(key, JSON.stringify(userSettings));\n}\n", "import { getLocalizedString } from \"./getLocalizedString.js\";\n\nconst template = `\n\t<dialog class=\"alert-dialog\">\n\t\t\t<form method=\"dialog\">\n\t\t\t\t\t<article></article>\n\t\t\t\t\t<footer>\n\t\t\t\t\t\t\t<menu></menu>\n\t\t\t\t\t</footer>\n\t\t\t</form>\n\t</dialog>\n`;\n\nif (globalThis.document && !document.querySelector(\"#AlertDialogTemplate\")) {\n\tlet $template = document.createElement(\"template\");\n\t$template.id = \"AlertDialogTemplate\";\n\t$template.innerHTML = template;\n\tdocument.body.append($template);\n}\n\nexport function waitForDialog(dialog: HTMLDialogElement) {\n\treturn new Promise((resolve) => {\n\t\tdialog.addEventListener(\"close\", resolve, { once: true });\n\t});\n}\n\nexport type AlertDialogButton = {\n\tlabel: string;\n\tvalue: string;\n\tprimary?: boolean;\n};\n\nexport type AlertDialogOptions = {\n\tbuttons: AlertDialogButton[];\n\tcontent: string | HTMLElement;\n\tclassName?: string;\n\tid?: string;\n\ttitle?: string;\n};\n\nconst alertDialogPromiseMap = new Map<string, Promise<string>>();\n\nexport async function openAlertDialog({ buttons, content, className, id, title }: AlertDialogOptions) {\n\tif (id && alertDialogPromiseMap.has(id)) {\n\t\treturn await alertDialogPromiseMap.get(id);\n\t}\n\n\tlet $template = document.querySelector<HTMLTemplateElement>(\"#AlertDialogTemplate\");\n\tif (!$template) throw Error(\"No alert dialog template found\");\n\n\tlet $dialog = $template.content.firstElementChild?.cloneNode(true) as HTMLDialogElement | null;\n\tlet $content = $dialog?.querySelector(\"article\");\n\tlet $menu = $dialog?.querySelector(\"footer menu\");\n\n\tif (!$dialog || !$content || !$menu) throw Error(\"Invalid alert dialog template\");\n\n\tif (className) {\n\t\tclassName.split(/\\s+/).forEach((className) => $dialog?.classList.add(className));\n\t}\n\n\tif (title) {\n\t\tlet $header = document.createElement(\"header\");\n\t\t$header.append(title);\n\t\t$content.parentNode?.insertBefore($header, $content);\n\t}\n\n\t$content.appendChild(typeof content === \"string\" ? document.createTextNode(content) : content);\n\tfor (let { label, value, primary } of buttons) {\n\t\tlet listItem = document.createElement(\"li\");\n\t\tlet buttonElem = document.createElement(\"button\");\n\t\tbuttonElem.value = value;\n\t\tif (primary) {\n\t\t\tbuttonElem.classList.add(\"primary\");\n\t\t}\n\t\tbuttonElem.textContent = label;\n\t\tlistItem.appendChild(buttonElem);\n\t\t$menu.appendChild(buttonElem);\n\t}\n\n\tdocument.body.appendChild($dialog);\n\t$dialog.showModal();\n\n\tlet dialogPromise = waitForDialog($dialog)\n\t\t.then(() => {\n\t\t\tif (id && alertDialogPromiseMap.has(id)) {\n\t\t\t\talertDialogPromiseMap.delete(id);\n\t\t\t}\n\t\t})\n\t\t.then(() => {\n\t\t\tlet result = $dialog?.returnValue || \"cancel\";\n\t\t\tif ($dialog) document.body.removeChild($dialog);\n\n\t\t\treturn result;\n\t\t});\n\n\tif (id) {\n\t\talertDialogPromiseMap.set(id, dialogPromise);\n\t}\n\n\treturn await dialogPromise;\n}\n\nexport enum ConfirmButtons {\n\tYesNo,\n\tOkCancel,\n}\n\nexport type ConfirmOptions = {\n\tbuttons?: ConfirmButtons;\n\ttitle?: string;\n};\n\nexport async function confirm(prompt: string, options: ConfirmOptions = {}): Promise<boolean> {\n\tlet { buttons: optionButtons = ConfirmButtons.YesNo, title } = options;\n\tlet buttons: AlertDialogButton[] =\n\t\toptionButtons === ConfirmButtons.OkCancel\n\t\t\t? [\n\t\t\t\t\t{ label: getLocalizedString(\"OK\"), value: \"yes\", primary: true },\n\t\t\t\t\t{ label: getLocalizedString(\"Cancel\"), value: \"no\" },\n\t\t\t ]\n\t\t\t: [\n\t\t\t\t\t{ label: getLocalizedString(\"Yes\"), value: \"yes\", primary: true },\n\t\t\t\t\t{ label: getLocalizedString(\"No\"), value: \"no\" },\n\t\t\t ];\n\n\tlet result = await openAlertDialog({ content: prompt, buttons, className: \"alert-dialog-confirm\", title });\n\treturn result === \"yes\";\n}\n\nexport type AlertOptions = {\n\ttitle?: string;\n};\n\nexport async function alert(prompt: string, options: AlertOptions = {}): Promise<void> {\n\tawait openAlertDialog({\n\t\tcontent: prompt,\n\t\tclassName: \"alert-dialog-alert\",\n\t\tbuttons: [{ label: getLocalizedString(\"OK\"), value: \"ok\", primary: true }],\n\t\t...options,\n\t});\n}\n", "import { UserSession } from \"./UserSession.js\";\nimport { alert, confirm, openAlertDialog } from \"./alert.js\";\nimport \"./errorHandler.js\";\nimport { expose } from \"./expose.js\";\nimport { getLocalizedString } from \"./getLocalizedString.js\";\nimport { localize } from \"./localize.js\";\nimport { logActivity, startActivity } from \"./logActivity.js\";\n\nexport { default as mitt } from \"mitt\";\nexport { toLocalISODate, toLocalISODateTime } from \"./date.js\";\nexport { downloadBlob } from \"./downloadBlob.js\";\nexport { downloadRequest } from \"./downloadRequest.js\";\nexport type { DownloadParameters, DownloadItem } from \"./downloadRequest.js\";\nexport { expose } from \"./expose.js\";\nexport { getUserImage } from \"./getUserImage.js\";\nexport type { getUserImageOptions } from \"./getUserImage.js\";\nexport { getLocalizedString } from \"./getLocalizedString.js\";\nexport { has } from \"./has.js\";\nexport { invariant } from \"./invariant.js\";\nexport { localize } from \"./localize.js\";\nexport { default as localStorage } from \"./localStorage.js\";\nexport { logActivity, startActivity } from \"./logActivity.js\";\nexport { default as SessionHandler } from \"./SessionHandler.js\";\nexport { UserSession };\nexport { getSettings, saveSettings } from \"./settings.js\";\nexport { alert, confirm, ConfirmButtons, openAlertDialog, waitForDialog } from \"./alert.js\";\nexport type { AlertDialogButton, AlertDialogOptions, AlertOptions, ConfirmOptions } from \"./alert.js\";\n\nexport const version = __VERSION__;\n\ndeclare global {\n\tvar __VERSION__: string;\n\tvar __DEV__: number;\n\tvar af: AfCore;\n\n\tinterface Window {\n\t\taf: AfCore;\n\t}\n}\n\nexport interface AfArticle {\n\thostName: string;\n\ti18n: Record<string, string>;\n\tid: string;\n}\n\nexport interface AfCore {\n\tarticle: AfArticle;\n\tcommon: {\n\t\tgetLocalizedString: typeof getLocalizedString;\n\t\texpose: typeof expose;\n\t\tlocalize: typeof localize;\n\t\tlogActivity: typeof logActivity;\n\t\tstartActivity: typeof startActivity;\n\t\talert: typeof alert;\n\t\tconfirm: typeof confirm;\n\t\topenAlertDialog: typeof openAlertDialog;\n\t};\n\tcontrols?: {\n\t\talert?: (message: string, callback?: () => void) => void;\n\t\tconfirm?: (options: {\n\t\t\ttitle: string;\n\t\t\tmessage: string;\n\t\t\tbuttons: string[];\n\t\t\tcallback: (button: number) => void;\n\t\t}) => void;\n\t};\n\tuserSession: UserSession;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "SessionHandler", "mitt_default", "callback", "type", "authPromise", "resolve", "eventHandler", "dialog", "link", "eventName", "handler", "UserSession", "SessionHandler", "userData", "event", "data", "toLocalISODate", "date", "toLocalISODateTime", "pad", "num", "downloadBlob", "blob", "fileName", "resolve", "reject", "url", "parent", "anchor", "ex", "invariant", "condition", "message", "provided", "downloadRequest", "request", "fileName", "signal", "onProgress", "reportProgress", "progress", "bytesReceived", "response", "data", "invariant", "reader", "stream", "controller", "pump", "read", "blob", "downloadBlob", "err", "has", "obj", "key", "funcRegex", "parseFunc", "func", "match", "invariant", "Namespace", "Namespace_default", "requireNamespace", "root", "namespace", "path", "current", "i", "Namespace_default", "expose", "name", "value", "options", "func", "funcName", "parseFunc", "invariant", "keyName", "namespace", "pathParts", "requireNamespace", "has", "sizeMap", "getUserImage", "primKeyOrOptions", "login", "hash", "size", "sizePx", "fetchLocalizedString", "text", "response", "getLocalizedString", "string", "wait", "has", "promise", "fetchLocalizedString", "text", "localize", "stringParts", "args", "invariant", "stringToLocalize", "s", "i", "localized", "getLocalizedString", "arg", "index", "getLocalKey", "key", "LocalStorage", "global", "defaultValue", "lsKey", "value", "baseKey", "localStorage_default", "logActivity", "activity", "parameters", "timeElapsed", "response", "data", "startActivity", "start", "getKey", "article", "getSettings", "setting", "key", "settings", "saveSettings", "value", "userSettings", "template", "$template", "waitForDialog", "dialog", "resolve", "alertDialogPromiseMap", "openAlertDialog", "buttons", "content", "className", "id", "title", "$dialog", "$content", "$menu", "$header", "label", "value", "primary", "listItem", "buttonElem", "dialogPromise", "result", "ConfirmButtons", "confirm", "prompt", "options", "optionButtons", "getLocalizedString", "alert", "version"]
7
7
  }
@@ -547,18 +547,26 @@ var af;
547
547
  dialog.addEventListener("close", resolve, { once: true });
548
548
  });
549
549
  }
550
- async function openAlertDialog({ buttons, content, className }) {
550
+ var alertDialogPromiseMap = /* @__PURE__ */ new Map();
551
+ async function openAlertDialog({ buttons, content, className, id, title }) {
552
+ if (id && alertDialogPromiseMap.has(id)) {
553
+ return await alertDialogPromiseMap.get(id);
554
+ }
551
555
  let $template = document.querySelector("#AlertDialogTemplate");
552
556
  if (!$template)
553
557
  throw Error("No alert dialog template found");
554
558
  let $dialog = $template.content.firstElementChild?.cloneNode(true);
555
559
  let $content = $dialog?.querySelector("article");
556
560
  let $menu = $dialog?.querySelector("footer menu");
557
- console.log({ $dialog, $content, $menu });
558
561
  if (!$dialog || !$content || !$menu)
559
562
  throw Error("Invalid alert dialog template");
560
563
  if (className) {
561
- $dialog.classList.add(className);
564
+ className.split(/\s+/).forEach((className2) => $dialog?.classList.add(className2));
565
+ }
566
+ if (title) {
567
+ let $header = document.createElement("header");
568
+ $header.append(title);
569
+ $content.parentNode?.insertBefore($header, $content);
562
570
  }
563
571
  $content.appendChild(typeof content === "string" ? document.createTextNode(content) : content);
564
572
  for (let { label, value, primary } of buttons) {
@@ -574,40 +582,48 @@ var af;
574
582
  }
575
583
  document.body.appendChild($dialog);
576
584
  $dialog.showModal();
577
- await waitForDialog($dialog);
578
- let result = $dialog.returnValue || "cancel";
579
- document.body.removeChild($dialog);
580
- return result;
585
+ let dialogPromise = waitForDialog($dialog).then(() => {
586
+ if (id && alertDialogPromiseMap.has(id)) {
587
+ alertDialogPromiseMap.delete(id);
588
+ }
589
+ }).then(() => {
590
+ let result = $dialog?.returnValue || "cancel";
591
+ if ($dialog)
592
+ document.body.removeChild($dialog);
593
+ return result;
594
+ });
595
+ if (id) {
596
+ alertDialogPromiseMap.set(id, dialogPromise);
597
+ }
598
+ return await dialogPromise;
581
599
  }
582
600
  var ConfirmButtons = /* @__PURE__ */ ((ConfirmButtons2) => {
583
601
  ConfirmButtons2[ConfirmButtons2["YesNo"] = 0] = "YesNo";
584
602
  ConfirmButtons2[ConfirmButtons2["OkCancel"] = 1] = "OkCancel";
585
603
  return ConfirmButtons2;
586
604
  })(ConfirmButtons || {});
587
- async function confirm(prompt, button = 0 /* YesNo */) {
588
- let buttons = [
589
- { label: getLocalizedString("No"), value: "no" },
590
- { label: getLocalizedString("Yes"), value: "yes", primary: true }
605
+ async function confirm(prompt, options = {}) {
606
+ let { buttons: optionButtons = 0 /* YesNo */, title } = options;
607
+ let buttons = optionButtons === 1 /* OkCancel */ ? [
608
+ { label: getLocalizedString("OK"), value: "yes", primary: true },
609
+ { label: getLocalizedString("Cancel"), value: "no" }
610
+ ] : [
611
+ { label: getLocalizedString("Yes"), value: "yes", primary: true },
612
+ { label: getLocalizedString("No"), value: "no" }
591
613
  ];
592
- console.log(button);
593
- if (button == 1 /* OkCancel */) {
594
- buttons = [
595
- { label: getLocalizedString("Cancel"), value: "no" },
596
- { label: getLocalizedString("OK"), value: "yes", primary: true }
597
- ];
598
- }
599
- let result = await openAlertDialog({ content: prompt, buttons });
614
+ let result = await openAlertDialog({ content: prompt, buttons, className: "alert-dialog-confirm", title });
600
615
  return result === "yes";
601
616
  }
602
- async function alert(prompt) {
617
+ async function alert(prompt, options = {}) {
603
618
  await openAlertDialog({
604
619
  content: prompt,
605
- className: "alert",
606
- buttons: [{ label: getLocalizedString("OK"), value: "ok", primary: true }]
620
+ className: "alert-dialog-alert",
621
+ buttons: [{ label: getLocalizedString("OK"), value: "ok", primary: true }],
622
+ ...options
607
623
  });
608
624
  }
609
625
 
610
626
  // src/index.ts
611
- var version = "2.7.0";
627
+ var version = "2.7.2";
612
628
  return __toCommonJS(src_exports);
613
629
  })();
@@ -573,19 +573,27 @@ af.common = (() => {
573
573
  dialog.addEventListener("close", resolve, { once: true });
574
574
  });
575
575
  }
576
- async function openAlertDialog({ buttons, content, className }) {
577
- var _a2;
576
+ var alertDialogPromiseMap = /* @__PURE__ */ new Map();
577
+ async function openAlertDialog({ buttons, content, className, id, title }) {
578
+ var _a2, _b;
579
+ if (id && alertDialogPromiseMap.has(id)) {
580
+ return await alertDialogPromiseMap.get(id);
581
+ }
578
582
  let $template = document.querySelector("#AlertDialogTemplate");
579
583
  if (!$template)
580
584
  throw Error("No alert dialog template found");
581
585
  let $dialog = (_a2 = $template.content.firstElementChild) == null ? void 0 : _a2.cloneNode(true);
582
586
  let $content = $dialog == null ? void 0 : $dialog.querySelector("article");
583
587
  let $menu = $dialog == null ? void 0 : $dialog.querySelector("footer menu");
584
- console.log({ $dialog, $content, $menu });
585
588
  if (!$dialog || !$content || !$menu)
586
589
  throw Error("Invalid alert dialog template");
587
590
  if (className) {
588
- $dialog.classList.add(className);
591
+ className.split(/\s+/).forEach((className2) => $dialog == null ? void 0 : $dialog.classList.add(className2));
592
+ }
593
+ if (title) {
594
+ let $header = document.createElement("header");
595
+ $header.append(title);
596
+ (_b = $content.parentNode) == null ? void 0 : _b.insertBefore($header, $content);
589
597
  }
590
598
  $content.appendChild(typeof content === "string" ? document.createTextNode(content) : content);
591
599
  for (let { label, value, primary } of buttons) {
@@ -601,40 +609,47 @@ af.common = (() => {
601
609
  }
602
610
  document.body.appendChild($dialog);
603
611
  $dialog.showModal();
604
- await waitForDialog($dialog);
605
- let result = $dialog.returnValue || "cancel";
606
- document.body.removeChild($dialog);
607
- return result;
612
+ let dialogPromise = waitForDialog($dialog).then(() => {
613
+ if (id && alertDialogPromiseMap.has(id)) {
614
+ alertDialogPromiseMap.delete(id);
615
+ }
616
+ }).then(() => {
617
+ let result = ($dialog == null ? void 0 : $dialog.returnValue) || "cancel";
618
+ if ($dialog)
619
+ document.body.removeChild($dialog);
620
+ return result;
621
+ });
622
+ if (id) {
623
+ alertDialogPromiseMap.set(id, dialogPromise);
624
+ }
625
+ return await dialogPromise;
608
626
  }
609
627
  var ConfirmButtons = /* @__PURE__ */ ((ConfirmButtons2) => {
610
628
  ConfirmButtons2[ConfirmButtons2["YesNo"] = 0] = "YesNo";
611
629
  ConfirmButtons2[ConfirmButtons2["OkCancel"] = 1] = "OkCancel";
612
630
  return ConfirmButtons2;
613
631
  })(ConfirmButtons || {});
614
- async function confirm(prompt, button = 0 /* YesNo */) {
615
- let buttons = [
616
- { label: getLocalizedString("No"), value: "no" },
617
- { label: getLocalizedString("Yes"), value: "yes", primary: true }
632
+ async function confirm(prompt, options = {}) {
633
+ let { buttons: optionButtons = 0 /* YesNo */, title } = options;
634
+ let buttons = optionButtons === 1 /* OkCancel */ ? [
635
+ { label: getLocalizedString("OK"), value: "yes", primary: true },
636
+ { label: getLocalizedString("Cancel"), value: "no" }
637
+ ] : [
638
+ { label: getLocalizedString("Yes"), value: "yes", primary: true },
639
+ { label: getLocalizedString("No"), value: "no" }
618
640
  ];
619
- console.log(button);
620
- if (button == 1 /* OkCancel */) {
621
- buttons = [
622
- { label: getLocalizedString("Cancel"), value: "no" },
623
- { label: getLocalizedString("OK"), value: "yes", primary: true }
624
- ];
625
- }
626
- let result = await openAlertDialog({ content: prompt, buttons });
641
+ let result = await openAlertDialog({ content: prompt, buttons, className: "alert-dialog-confirm", title });
627
642
  return result === "yes";
628
643
  }
629
- async function alert(prompt) {
630
- await openAlertDialog({
644
+ async function alert(prompt, options = {}) {
645
+ await openAlertDialog(__spreadValues({
631
646
  content: prompt,
632
- className: "alert",
647
+ className: "alert-dialog-alert",
633
648
  buttons: [{ label: getLocalizedString("OK"), value: "ok", primary: true }]
634
- });
649
+ }, options));
635
650
  }
636
651
 
637
652
  // src/index.ts
638
- var version = "2.7.0";
653
+ var version = "2.7.2";
639
654
  return __toCommonJS(src_exports);
640
655
  })();
@@ -1,4 +1,4 @@
1
- var af=af||{};af.common=(()=>{var b=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var Q=Object.getOwnPropertyNames,H=Object.getOwnPropertySymbols;var U=Object.prototype.hasOwnProperty,ee=Object.prototype.propertyIsEnumerable;var D=(e,t,n)=>t in e?b(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,C=(e,t)=>{for(var n in t||(t={}))U.call(t,n)&&D(e,n,t[n]);if(H)for(var n of H(t))ee.call(t,n)&&D(e,n,t[n]);return e};var te=(e,t)=>{for(var n in t)b(e,n,{get:t[n],enumerable:!0})},ne=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Q(t))!U.call(e,o)&&o!==n&&b(e,o,{get:()=>t[o],enumerable:!(r=G(t,o))||r.enumerable});return e};var oe=e=>ne(b({},"__esModule",{value:!0}),e);var a=(e,t,n)=>(D(e,typeof t!="symbol"?t+"":t,n),n);var ce={};te(ce,{ConfirmButtons:()=>O,SessionHandler:()=>p,UserSession:()=>w,alert:()=>W,confirm:()=>Y,downloadBlob:()=>v,downloadRequest:()=>P,expose:()=>E,getLocalizedString:()=>u,getSettings:()=>Z,getUserImage:()=>j,has:()=>y,invariant:()=>c,localStorage:()=>K,localize:()=>F,logActivity:()=>$,mitt:()=>S,openAlertDialog:()=>A,saveSettings:()=>X,startActivity:()=>J,toLocalISODate:()=>M,toLocalISODateTime:()=>I,version:()=>se,waitForDialog:()=>N});function S(e){return{all:e=e||new Map,on:function(t,n){var r=e.get(t);r?r.push(n):e.set(t,[n])},off:function(t,n){var r=e.get(t);r&&(n?r.splice(r.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var r=e.get(t);r&&r.slice().map(function(o){o(n)}),(r=e.get("*"))&&r.slice().map(function(o){o(t,n)})}}}var p=class{constructor(){a(this,"eventHandler",S())}authenticated(){this.eventHandler.emit("onAuthenticated")}async expired(t,n){try{let r=new Promise(i=>{let l=()=>{this.eventHandler.off("onAuthenticated",l),t==null||t(),i()};this.eventHandler.on("onAuthenticated",l)}),o=document.querySelector("dialog.session-expired-dialog");if(o)await r;else{o=document.createElement("dialog"),o.className="session-expired-dialog",o.style.display="flex",o.style.padding="0",o.style.left="50%",o.style.transform="translateX(-50%)";let i="/login?ReturnUrl=%2fapi/sessionexpired/remove";n!=="RequireTwoFactor"?await fetch("/logout",{method:"POST"}):i="/login?RequireTwoFactor=1&ReturnUrl=%2fapi/sessionexpired/remove",o.innerHTML=`<iframe sandbox="allow-same-origin allow-scripts allow-modals allow-top-navigation-by-user-activation allow-forms" src="${i}" style="border:0;width:min(500px,100vw);height:min(700px, 100vh);"></iframe>`,document.body.append(o),o.showModal(),await r,o.remove()}}catch(r){window.location.href=`/login?ReturnUrl=${encodeURIComponent(window.location.pathname)}${encodeURIComponent(window.location.search)}`}}attachEvent(t,n){return this.eventHandler.on(t,n)}detachEvent(t,n){return this.eventHandler.off(t,n)}};var w=class extends p{constructor(n){super();a(this,"amDesignator","a.m.");a(this,"dayNames",["sunday","monday","tuesday","wednesday","thursday","friday","saturday"]);a(this,"dayNamesShort",["sun","mon","tue","wed","thu","fri","sat"]);a(this,"decimalSeparator",".");a(this,"domain","OB");a(this,"email");a(this,"formats");a(this,"groupSeparator",null);a(this,"integratedSecurity",!1);a(this,"isDeveloper",!1);a(this,"login","");a(this,"loginType");a(this,"monthNames",["january","february","march","april","may","june","july","august","september","october","november","december",""]);a(this,"monthNamesShort",["jan","feb","mar","apr","may","jun","jul","augt","sep","oct","nov","dec",""]);a(this,"name");a(this,"pmDesignator","p.m.");a(this,"shortDateFormat","dd.MM.yyyy");a(this,"culture","en-GB");a(this,"uiculture","en-GB");this.formats={},Object.assign(this,n)}};var q;(q=window.window)==null||q.addEventListener("error",e=>{var t,n,r,o,i,l,s;try{let f={error:(r=(n=(t=e.error)==null?void 0:t.message)!=null?n:e.message)!=null?r:null,file:e.filename,line:(o=e.lineno)!=null?o:0,column:(i=e.colno)!=null?i:0,stack:(s=(l=e.error)==null?void 0:l.stack)!=null?s:null};fetch("/data/Logger/LogError",{body:JSON.stringify(f),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"})}catch(f){}});function M(e){return e?I(e).substring(0,10):null}function m(e){return String(e).padStart(2,"0")}function I(e){return e?`${e.getFullYear()}-${m(e.getMonth()+1)}-${m(e.getDate())}T${m(e.getHours())}:${m(e.getMinutes())}:${m(e.getSeconds())}.${m(e.getMilliseconds())}`:null}function v(e,t){return new Promise(function(n,r){try{let o=URL.createObjectURL(e),i=document.body,l=document.createElement("a");l.setAttribute("download",t),l.href=o,i.append(l),l.click(),i.removeChild(l),setTimeout(function(){URL.revokeObjectURL(o),n()},250)}catch(o){r(o)}})}function c(e,t){if(e)return;let n=typeof t=="function"?t():t;throw new Error(n!=null?n:"Invariant failed")}async function P(e,{fileName:t,signal:n,onProgress:r}){var l;function o(s){typeof r=="function"&&r(C({},s))}let i=0;o({status:"requested"});try{let s=await fetch(e);if(!s.ok||!s.body){if((l=s.headers.get("content-type"))!=null&&l.includes("application/json")){let g=await s.json();c(!g.error,g.error)}throw new Error(`${s.status} ${s.statusText}`)}try{let g=s.body.getReader(),L=new ReadableStream({start:function(h){function x(){return g.read().then(function(d){if(d.done){h.close();return}return i+=d.value.length,o({bytesReceived:i,status:"downloading"}),h.enqueue(d.value),x()})}return x()}});s=new Response(L)}catch(g){}let f=await s.blob();o({bytesReceived:i,status:"downloaded"}),await v(f,t),o({bytesReceived:i,status:"completed"})}catch(s){n!=null&&n.aborted?o({status:"cancelled"}):o({error:s.message,status:"error"})}}function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var re=/^function(?:\s+([a-zA-Z$_][a-zA-Z0-9$_]*))?\s*\(((?:(?:\s*[a-zA-Z$_][a-zA-Z0-9$_]*)(?:\s*,\s*[a-zA-Z$_][a-zA-Z0-9$_]*)*)?)\s*\)\s*\{((?:.|\n|\r)*)\}$/;function z(e){var t=e.toString().match(re);return c(t,"Unable to parse function!"),{name:t[1],args:t[2].split(","),body:t[3]}}function _(){}_.prototype=Object.create(null);var k=_;function T(e,t){if(typeof e=="object"){if(typeof t=="string"){let n=t.split(".");return T(e,n)}else if(Array.isArray(t)){let n=e;for(let r=0;r<t.length;r++)n=n[t[r]]=n[t[r]]||new k;return n}}}function E(e,t,n={}){if(Array.isArray(t))for(let r of t){let{name:o}=z(r);c(o,"Unable to detect name of function! Name it, or only supply one function and include name in first parameter."),E(e,r)}else{let r,o;if(typeof t=="function"&&(r=z(t).name),typeof e=="string"){let i=e.split(".");r||(r=i[i.length-1],i=i.slice(0,i.length-1)),o=T(window,i)}else r&&(typeof e=="object"||typeof e=="function")?o=e:c(!1,"Invalid typeof parameter 'name', or unable to parse pValue!");y(o,r)&&(n==null?void 0:n.overwrite)!==!0?console.warn([e,r].join(".")+" is already defined!"):o[r]=t}}var ie={xs:64,sm:128,md:256,lg:512,xl:void 0};function j(e,t,n,r="xs"){if(e&&typeof e=="object")return j(e.primKey,e.login,e.hash,e.size);if(!e||!n)return"";let o=ie[r];return`/api/data/blob/EmployeesLookup/${e}/Image/${encodeURIComponent(t!=null?t:"")}${t?".":""}${encodeURIComponent(n)}.jpg${o?`?width=${o}`:""}`}async function ae(e){try{let t=await fetch(`/api/user/localize/new/${af.article.id}`,{body:JSON.stringify({text:e}),headers:{Accept:"application/json; */*","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},method:"POST"});if(t.ok)return await t.json()}catch(t){}return e}function u(e,t){var n;if(typeof e=="string"&&e.trim().length===0)return e;if(!(e===void 0||e===""||e===null))if(((n=af==null?void 0:af.article)==null?void 0:n.i18n)!==void 0){if(!y(af.article.i18n,e)){af.article.i18n[e]=e;let r=ae(e).then(o=>(af.article.i18n[e]=o,o));if(t)return r}return af.article.i18n[e]}else return e}function F(e,...t){c(Array.isArray(e)&&e.length===t.length+1,"Method 'localize' must be used as a tag function");let n=e.map((o,i)=>i===e.length-1?o:`${o}$${i}`).join(""),r=u(n);return t.forEach((o,i)=>{r=r.replace("$"+i,o)}),r}function B(e){var t;return[((t=af==null?void 0:af.article)==null?void 0:t.id)||"","common",e].join(".")}var R=class{isPersisted(){return!0}getLocalStorageKey(t,n){return n?["common",t].join("."):B(t)}get(t,n,r){let o=this.getLocalStorageKey(t,r),i=localStorage.getItem(o);return i!==null?JSON.parse(i):n}set(t,n,r){localStorage.setItem(this.getLocalStorageKey(t,r),JSON.stringify(n))}remove(t,n){let r=this.getLocalStorageKey(t,n);return localStorage.getItem(r)!==null?(localStorage.removeItem(r),!0):!1}clear(){let t=B("");for(let n in localStorage)n.slice(0,t.length)===t&&localStorage.removeItem(n)}},K=new R;async function $(e,t,n=0){var r;try{let o=await fetch("/api/logging/log-activity",{method:"POST",body:JSON.stringify({article:af.article.id,timeElapsed:n,action:e,parameters:t}),headers:{"Content-Type":"application/json",Accept:"application/json"}});if(!o.ok)if((r=o.headers.get("Content-Type"))!=null&&r.includes("application/json")){let i=await o.json();console.error(i.error)}else console.error(`${o.status} ${o.statusText}`)}catch(o){}}function J(e,t){let n=performance.now();return()=>$(e,t,performance.now()-n)}function V(e){return`${e||af.article.id}.${af.userSession.login}`}function Z(e,t){if(!(af!=null&&af.userSession))return null;let n=V(t),r=JSON.parse(localStorage.getItem(n)||"{}");return e?r[e]||null:r}function X(e,t,n){if(!(af!=null&&af.userSession))return;let r=V(n),o=JSON.parse(localStorage.getItem(r)||"{}");typeof t<"u"?o[e]=t:o=e,localStorage.setItem(r,JSON.stringify(o))}var le=`
1
+ var af=af||{};af.common=(()=>{var v=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames,U=Object.getOwnPropertySymbols;var M=Object.prototype.hasOwnProperty,oe=Object.prototype.propertyIsEnumerable;var E=(e,t,n)=>t in e?v(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,A=(e,t)=>{for(var n in t||(t={}))M.call(t,n)&&E(e,n,t[n]);if(U)for(var n of U(t))oe.call(t,n)&&E(e,n,t[n]);return e};var ie=(e,t)=>{for(var n in t)v(e,n,{get:t[n],enumerable:!0})},ae=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of re(t))!M.call(e,o)&&o!==n&&v(e,o,{get:()=>t[o],enumerable:!(r=ne(t,o))||r.enumerable});return e};var le=e=>ae(v({},"__esModule",{value:!0}),e);var l=(e,t,n)=>(E(e,typeof t!="symbol"?t+"":t,n),n);var pe={};ie(pe,{ConfirmButtons:()=>P,SessionHandler:()=>g,UserSession:()=>L,alert:()=>Q,confirm:()=>G,downloadBlob:()=>I,downloadRequest:()=>k,expose:()=>N,getLocalizedString:()=>d,getSettings:()=>Y,getUserImage:()=>R,has:()=>y,invariant:()=>u,localStorage:()=>V,localize:()=>K,logActivity:()=>C,mitt:()=>D,openAlertDialog:()=>z,saveSettings:()=>W,startActivity:()=>Z,toLocalISODate:()=>_,toLocalISODateTime:()=>T,version:()=>fe,waitForDialog:()=>H});function D(e){return{all:e=e||new Map,on:function(t,n){var r=e.get(t);r?r.push(n):e.set(t,[n])},off:function(t,n){var r=e.get(t);r&&(n?r.splice(r.indexOf(n)>>>0,1):e.set(t,[]))},emit:function(t,n){var r=e.get(t);r&&r.slice().map(function(o){o(n)}),(r=e.get("*"))&&r.slice().map(function(o){o(t,n)})}}}var g=class{constructor(){l(this,"eventHandler",D())}authenticated(){this.eventHandler.emit("onAuthenticated")}async expired(t,n){try{let r=new Promise(i=>{let a=()=>{this.eventHandler.off("onAuthenticated",a),t==null||t(),i()};this.eventHandler.on("onAuthenticated",a)}),o=document.querySelector("dialog.session-expired-dialog");if(o)await r;else{o=document.createElement("dialog"),o.className="session-expired-dialog",o.style.display="flex",o.style.padding="0",o.style.left="50%",o.style.transform="translateX(-50%)";let i="/login?ReturnUrl=%2fapi/sessionexpired/remove";n!=="RequireTwoFactor"?await fetch("/logout",{method:"POST"}):i="/login?RequireTwoFactor=1&ReturnUrl=%2fapi/sessionexpired/remove",o.innerHTML=`<iframe sandbox="allow-same-origin allow-scripts allow-modals allow-top-navigation-by-user-activation allow-forms" src="${i}" style="border:0;width:min(500px,100vw);height:min(700px, 100vh);"></iframe>`,document.body.append(o),o.showModal(),await r,o.remove()}}catch(r){window.location.href=`/login?ReturnUrl=${encodeURIComponent(window.location.pathname)}${encodeURIComponent(window.location.search)}`}}attachEvent(t,n){return this.eventHandler.on(t,n)}detachEvent(t,n){return this.eventHandler.off(t,n)}};var L=class extends g{constructor(n){super();l(this,"amDesignator","a.m.");l(this,"dayNames",["sunday","monday","tuesday","wednesday","thursday","friday","saturday"]);l(this,"dayNamesShort",["sun","mon","tue","wed","thu","fri","sat"]);l(this,"decimalSeparator",".");l(this,"domain","OB");l(this,"email");l(this,"formats");l(this,"groupSeparator",null);l(this,"integratedSecurity",!1);l(this,"isDeveloper",!1);l(this,"login","");l(this,"loginType");l(this,"monthNames",["january","february","march","april","may","june","july","august","september","october","november","december",""]);l(this,"monthNamesShort",["jan","feb","mar","apr","may","jun","jul","augt","sep","oct","nov","dec",""]);l(this,"name");l(this,"pmDesignator","p.m.");l(this,"shortDateFormat","dd.MM.yyyy");l(this,"culture","en-GB");l(this,"uiculture","en-GB");this.formats={},Object.assign(this,n)}};var q;(q=window.window)==null||q.addEventListener("error",e=>{var t,n,r,o,i,a,s;try{let p={error:(r=(n=(t=e.error)==null?void 0:t.message)!=null?n:e.message)!=null?r:null,file:e.filename,line:(o=e.lineno)!=null?o:0,column:(i=e.colno)!=null?i:0,stack:(s=(a=e.error)==null?void 0:a.stack)!=null?s:null};fetch("/data/Logger/LogError",{body:JSON.stringify(p),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"})}catch(p){}});function _(e){return e?T(e).substring(0,10):null}function m(e){return String(e).padStart(2,"0")}function T(e){return e?`${e.getFullYear()}-${m(e.getMonth()+1)}-${m(e.getDate())}T${m(e.getHours())}:${m(e.getMinutes())}:${m(e.getSeconds())}.${m(e.getMilliseconds())}`:null}function I(e,t){return new Promise(function(n,r){try{let o=URL.createObjectURL(e),i=document.body,a=document.createElement("a");a.setAttribute("download",t),a.href=o,i.append(a),a.click(),i.removeChild(a),setTimeout(function(){URL.revokeObjectURL(o),n()},250)}catch(o){r(o)}})}function u(e,t){if(e)return;let n=typeof t=="function"?t():t;throw new Error(n!=null?n:"Invariant failed")}async function k(e,{fileName:t,signal:n,onProgress:r}){var a;function o(s){typeof r=="function"&&r(A({},s))}let i=0;o({status:"requested"});try{let s=await fetch(e);if(!s.ok||!s.body){if((a=s.headers.get("content-type"))!=null&&a.includes("application/json")){let f=await s.json();u(!f.error,f.error)}throw new Error(`${s.status} ${s.statusText}`)}try{let f=s.body.getReader(),S=new ReadableStream({start:function(h){function c(){return f.read().then(function(x){if(x.done){h.close();return}return i+=x.value.length,o({bytesReceived:i,status:"downloading"}),h.enqueue(x.value),c()})}return c()}});s=new Response(S)}catch(f){}let p=await s.blob();o({bytesReceived:i,status:"downloaded"}),await I(p,t),o({bytesReceived:i,status:"completed"})}catch(s){n!=null&&n.aborted?o({status:"cancelled"}):o({error:s.message,status:"error"})}}function y(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var se=/^function(?:\s+([a-zA-Z$_][a-zA-Z0-9$_]*))?\s*\(((?:(?:\s*[a-zA-Z$_][a-zA-Z0-9$_]*)(?:\s*,\s*[a-zA-Z$_][a-zA-Z0-9$_]*)*)?)\s*\)\s*\{((?:.|\n|\r)*)\}$/;function O(e){var t=e.toString().match(se);return u(t,"Unable to parse function!"),{name:t[1],args:t[2].split(","),body:t[3]}}function B(){}B.prototype=Object.create(null);var F=B;function j(e,t){if(typeof e=="object"){if(typeof t=="string"){let n=t.split(".");return j(e,n)}else if(Array.isArray(t)){let n=e;for(let r=0;r<t.length;r++)n=n[t[r]]=n[t[r]]||new F;return n}}}function N(e,t,n={}){if(Array.isArray(t))for(let r of t){let{name:o}=O(r);u(o,"Unable to detect name of function! Name it, or only supply one function and include name in first parameter."),N(e,r)}else{let r,o;if(typeof t=="function"&&(r=O(t).name),typeof e=="string"){let i=e.split(".");r||(r=i[i.length-1],i=i.slice(0,i.length-1)),o=j(window,i)}else r&&(typeof e=="object"||typeof e=="function")?o=e:u(!1,"Invalid typeof parameter 'name', or unable to parse pValue!");y(o,r)&&(n==null?void 0:n.overwrite)!==!0?console.warn([e,r].join(".")+" is already defined!"):o[r]=t}}var ce={xs:64,sm:128,md:256,lg:512,xl:void 0};function R(e,t,n,r="xs"){if(e&&typeof e=="object")return R(e.primKey,e.login,e.hash,e.size);if(!e||!n)return"";let o=ce[r];return`/api/data/blob/EmployeesLookup/${e}/Image/${encodeURIComponent(t!=null?t:"")}${t?".":""}${encodeURIComponent(n)}.jpg${o?`?width=${o}`:""}`}async function ue(e){try{let t=await fetch(`/api/user/localize/new/${af.article.id}`,{body:JSON.stringify({text:e}),headers:{Accept:"application/json; */*","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},method:"POST"});if(t.ok)return await t.json()}catch(t){}return e}function d(e,t){var n;if(typeof e=="string"&&e.trim().length===0)return e;if(!(e===void 0||e===""||e===null))if(((n=af==null?void 0:af.article)==null?void 0:n.i18n)!==void 0){if(!y(af.article.i18n,e)){af.article.i18n[e]=e;let r=ue(e).then(o=>(af.article.i18n[e]=o,o));if(t)return r}return af.article.i18n[e]}else return e}function K(e,...t){u(Array.isArray(e)&&e.length===t.length+1,"Method 'localize' must be used as a tag function");let n=e.map((o,i)=>i===e.length-1?o:`${o}$${i}`).join(""),r=d(n);return t.forEach((o,i)=>{r=r.replace("$"+i,o)}),r}function J(e){var t;return[((t=af==null?void 0:af.article)==null?void 0:t.id)||"","common",e].join(".")}var $=class{isPersisted(){return!0}getLocalStorageKey(t,n){return n?["common",t].join("."):J(t)}get(t,n,r){let o=this.getLocalStorageKey(t,r),i=localStorage.getItem(o);return i!==null?JSON.parse(i):n}set(t,n,r){localStorage.setItem(this.getLocalStorageKey(t,r),JSON.stringify(n))}remove(t,n){let r=this.getLocalStorageKey(t,n);return localStorage.getItem(r)!==null?(localStorage.removeItem(r),!0):!1}clear(){let t=J("");for(let n in localStorage)n.slice(0,t.length)===t&&localStorage.removeItem(n)}},V=new $;async function C(e,t,n=0){var r;try{let o=await fetch("/api/logging/log-activity",{method:"POST",body:JSON.stringify({article:af.article.id,timeElapsed:n,action:e,parameters:t}),headers:{"Content-Type":"application/json",Accept:"application/json"}});if(!o.ok)if((r=o.headers.get("Content-Type"))!=null&&r.includes("application/json")){let i=await o.json();console.error(i.error)}else console.error(`${o.status} ${o.statusText}`)}catch(o){}}function Z(e,t){let n=performance.now();return()=>C(e,t,performance.now()-n)}function X(e){return`${e||af.article.id}.${af.userSession.login}`}function Y(e,t){if(!(af!=null&&af.userSession))return null;let n=X(t),r=JSON.parse(localStorage.getItem(n)||"{}");return e?r[e]||null:r}function W(e,t,n){if(!(af!=null&&af.userSession))return;let r=X(n),o=JSON.parse(localStorage.getItem(r)||"{}");typeof t<"u"?o[e]=t:o=e,localStorage.setItem(r,JSON.stringify(o))}var de=`
2
2
  <dialog class="alert-dialog">
3
3
  <form method="dialog">
4
4
  <article></article>
@@ -7,5 +7,5 @@ var af=af||{};af.common=(()=>{var b=Object.defineProperty;var G=Object.getOwnPro
7
7
  </footer>
8
8
  </form>
9
9
  </dialog>
10
- `;if(window.document&&!document.querySelector("#AlertDialogTemplate")){let e=document.createElement("template");e.id="AlertDialogTemplate",e.innerHTML=le,document.body.append(e)}function N(e){return new Promise(t=>{e.addEventListener("close",t,{once:!0})})}async function A({buttons:e,content:t,className:n}){var f;let r=document.querySelector("#AlertDialogTemplate");if(!r)throw Error("No alert dialog template found");let o=(f=r.content.firstElementChild)==null?void 0:f.cloneNode(!0),i=o==null?void 0:o.querySelector("article"),l=o==null?void 0:o.querySelector("footer menu");if(console.log({$dialog:o,$content:i,$menu:l}),!o||!i||!l)throw Error("Invalid alert dialog template");n&&o.classList.add(n),i.appendChild(typeof t=="string"?document.createTextNode(t):t);for(let{label:g,value:L,primary:h}of e){let x=document.createElement("li"),d=document.createElement("button");d.value=L,h&&d.classList.add("primary"),d.textContent=g,x.appendChild(d),l.appendChild(d)}document.body.appendChild(o),o.showModal(),await N(o);let s=o.returnValue||"cancel";return document.body.removeChild(o),s}var O=(n=>(n[n.YesNo=0]="YesNo",n[n.OkCancel=1]="OkCancel",n))(O||{});async function Y(e,t=0){let n=[{label:u("No"),value:"no"},{label:u("Yes"),value:"yes",primary:!0}];return console.log(t),t==1&&(n=[{label:u("Cancel"),value:"no"},{label:u("OK"),value:"yes",primary:!0}]),await A({content:e,buttons:n})==="yes"}async function W(e){await A({content:e,className:"alert",buttons:[{label:u("OK"),value:"ok",primary:!0}]})}var se="2.7.0";return oe(ce);})();
10
+ `;if(window.document&&!document.querySelector("#AlertDialogTemplate")){let e=document.createElement("template");e.id="AlertDialogTemplate",e.innerHTML=de,document.body.append(e)}function H(e){return new Promise(t=>{e.addEventListener("close",t,{once:!0})})}var w=new Map;async function z({buttons:e,content:t,className:n,id:r,title:o}){var S,h;if(r&&w.has(r))return await w.get(r);let i=document.querySelector("#AlertDialogTemplate");if(!i)throw Error("No alert dialog template found");let a=(S=i.content.firstElementChild)==null?void 0:S.cloneNode(!0),s=a==null?void 0:a.querySelector("article"),p=a==null?void 0:a.querySelector("footer menu");if(!a||!s||!p)throw Error("Invalid alert dialog template");if(n&&n.split(/\s+/).forEach(c=>a==null?void 0:a.classList.add(c)),o){let c=document.createElement("header");c.append(o),(h=s.parentNode)==null||h.insertBefore(c,s)}s.appendChild(typeof t=="string"?document.createTextNode(t):t);for(let{label:c,value:x,primary:ee}of e){let te=document.createElement("li"),b=document.createElement("button");b.value=x,ee&&b.classList.add("primary"),b.textContent=c,te.appendChild(b),p.appendChild(b)}document.body.appendChild(a),a.showModal();let f=H(a).then(()=>{r&&w.has(r)&&w.delete(r)}).then(()=>{let c=(a==null?void 0:a.returnValue)||"cancel";return a&&document.body.removeChild(a),c});return r&&w.set(r,f),await f}var P=(n=>(n[n.YesNo=0]="YesNo",n[n.OkCancel=1]="OkCancel",n))(P||{});async function G(e,t={}){let{buttons:n=0,title:r}=t,o=n===1?[{label:d("OK"),value:"yes",primary:!0},{label:d("Cancel"),value:"no"}]:[{label:d("Yes"),value:"yes",primary:!0},{label:d("No"),value:"no"}];return await z({content:e,buttons:o,className:"alert-dialog-confirm",title:r})==="yes"}async function Q(e,t={}){await z(A({content:e,className:"alert-dialog-alert",buttons:[{label:d("OK"),value:"ok",primary:!0}]},t))}var fe="2.7.2";return le(pe);})();
11
11
  //# sourceMappingURL=af.common.legacy.min.js.map