@olenbetong/appframe-core 1.2.3 → 1.3.0

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,19 +1,25 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
- var __hasOwnProp = Object.prototype.hasOwnProperty;
4
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
- var __defNormalProp = (obj, key2, value) => key2 in obj ? __defProp(obj, key2, { enumerable: true, configurable: true, writable: true, value }) : obj[key2] = value;
6
- var __spreadValues = (a, b) => {
7
- for (var prop in b || (b = {}))
8
- if (__hasOwnProp.call(b, prop))
9
- __defNormalProp(a, prop, b[prop]);
10
- if (__getOwnPropSymbols)
11
- for (var prop of __getOwnPropSymbols(b)) {
12
- if (__propIsEnum.call(b, prop))
13
- __defNormalProp(a, prop, b[prop]);
14
- }
15
- return a;
16
- };
1
+ // src/errorHandler.ts
2
+ window.addEventListener("error", (event) => {
3
+ try {
4
+ const data = {
5
+ error: event.message ?? null,
6
+ file: event.filename,
7
+ line: event.lineno ?? 0,
8
+ column: event.colno ?? 0,
9
+ stack: null
10
+ };
11
+ fetch("/data/Logger/LogError", {
12
+ body: JSON.stringify(data),
13
+ headers: {
14
+ Accept: "application/json",
15
+ "Content-Type": "application/json; charset=utf-8",
16
+ "X-Requested-With": "XMLHttpRequest"
17
+ },
18
+ method: "POST"
19
+ });
20
+ } catch (ex) {
21
+ }
22
+ });
17
23
 
18
24
  // ../../node_modules/mitt/dist/mitt.mjs
19
25
  function mitt_default(n) {
@@ -57,10 +63,9 @@ function downloadBlob(blob, fileName) {
57
63
 
58
64
  // src/downloadRequest.ts
59
65
  async function downloadRequest(request, { fileName, controller, onProgress }) {
60
- var _a, _b;
61
66
  function reportProgress(progress) {
62
67
  if (typeof onProgress === "function") {
63
- onProgress(__spreadValues({}, progress));
68
+ onProgress({ ...progress });
64
69
  }
65
70
  }
66
71
  let bytesReceived = 0;
@@ -68,7 +73,7 @@ async function downloadRequest(request, { fileName, controller, onProgress }) {
68
73
  try {
69
74
  let response = await fetch(request);
70
75
  if (!response.ok || !response.body) {
71
- if ((_a = response.headers.get("content-type")) == null ? void 0 : _a.includes("application/json")) {
76
+ if (response.headers.get("content-type")?.includes("application/json")) {
72
77
  let data = await response.json();
73
78
  if (data.error) {
74
79
  throw new Error(data.error);
@@ -104,7 +109,7 @@ async function downloadRequest(request, { fileName, controller, onProgress }) {
104
109
  await downloadBlob(blob, fileName);
105
110
  reportProgress({ bytesReceived, status: "completed" });
106
111
  } catch (err) {
107
- if ((_b = controller == null ? void 0 : controller.signal) == null ? void 0 : _b.aborted) {
112
+ if (controller?.signal?.aborted) {
108
113
  reportProgress({ status: "cancelled" });
109
114
  } else {
110
115
  reportProgress({ error: err.message, status: "error" });
@@ -114,7 +119,7 @@ async function downloadRequest(request, { fileName, controller, onProgress }) {
114
119
 
115
120
  // src/exportDataObject.ts
116
121
  function exportOptionsFromDataObject(dataObject, specifiedOptions) {
117
- return __spreadValues({
122
+ return {
118
123
  columns: dataObject.getFields().map((field) => ({ name: field.name })),
119
124
  distinctRows: dataObject.getParameter("distinctRows"),
120
125
  filterObject: dataObject.getParameter("filterObject"),
@@ -122,8 +127,9 @@ function exportOptionsFromDataObject(dataObject, specifiedOptions) {
122
127
  maxRecords: dataObject.getParameter("maxRecords"),
123
128
  sortOrder: dataObject.getParameter("sortOrder"),
124
129
  whereClause: dataObject.getParameter("whereClause"),
125
- whereObject: dataObject.getParameter("whereObject")
126
- }, specifiedOptions);
130
+ whereObject: dataObject.getParameter("whereObject"),
131
+ ...specifiedOptions
132
+ };
127
133
  }
128
134
  var defaultOptions = {
129
135
  columns: [],
@@ -136,12 +142,11 @@ var defaultOptions = {
136
142
  whereObject: null
137
143
  };
138
144
  function getDataObjectReportRequest(params) {
139
- var _a;
140
145
  const { articleId, dataObject, format, options } = params;
141
146
  const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;
142
147
  const body = "data=" + encodeURIComponent(JSON.stringify(reportOptions));
143
148
  const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;
144
- const controller = (_a = params.controller) != null ? _a : new AbortController();
149
+ const controller = params.controller ?? new AbortController();
145
150
  return {
146
151
  controller,
147
152
  request: new Request(requestUrl, {
@@ -275,8 +280,7 @@ async function getLocalizedStringAsync(string) {
275
280
  return string;
276
281
  }
277
282
  function afGetLocalizedString(string, wait) {
278
- var _a;
279
- if (((_a = af == null ? void 0 : af.article) == null ? void 0 : _a.i18n) !== void 0) {
283
+ if (af?.article?.i18n !== void 0) {
280
284
  if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {
281
285
  af.article.i18n[string] = string;
282
286
  let promise = getLocalizedStringAsync(string).then((text) => {
@@ -379,8 +383,7 @@ function getLocalizedString(string) {
379
383
 
380
384
  // src/localStorage.ts
381
385
  function getLocalKey(key2) {
382
- var _a;
383
- return [((_a = af == null ? void 0 : af.article) == null ? void 0 : _a.id) || "", "common", key2].join(".");
386
+ return [af?.article?.id || "", "common", key2].join(".");
384
387
  }
385
388
  var LocalStorage = class {
386
389
  isPersisted() {
@@ -596,12 +599,11 @@ function getFormValue(value, type) {
596
599
  return value;
597
600
  }
598
601
  function formDataToObject(form, typeMap = {}) {
599
- var _a;
600
602
  let formData = new FormData(form);
601
603
  let result = {};
602
604
  for (let entry of formData.entries()) {
603
605
  let field = entry[0];
604
- let type = (_a = typeMap == null ? void 0 : typeMap[field]) != null ? _a : "string";
606
+ let type = typeMap?.[field] ?? "string";
605
607
  let value = getFormValue(entry[1], type);
606
608
  if (result.hasOwnProperty(field)) {
607
609
  if (Array.isArray(result[field])) {
@@ -632,7 +634,7 @@ function getKey(article) {
632
634
  return `${articleKey}.${af.userSession.login}`;
633
635
  }
634
636
  function getSettings(setting, article) {
635
- if (!(af == null ? void 0 : af.userSession))
637
+ if (!af?.userSession)
636
638
  return null;
637
639
  const key2 = getKey(article);
638
640
  const settings = JSON.parse(localStorage.getItem(key2) || "{}");
@@ -642,7 +644,7 @@ function getSettings(setting, article) {
642
644
  return settings;
643
645
  }
644
646
  function saveSettings(setting, value, article) {
645
- if (!(af == null ? void 0 : af.userSession))
647
+ if (!af?.userSession)
646
648
  return;
647
649
  const key2 = getKey(article);
648
650
  let userSettings = JSON.parse(localStorage.getItem(key2) || "{}");
@@ -655,7 +657,7 @@ function saveSettings(setting, value, article) {
655
657
  }
656
658
 
657
659
  // src/index.ts
658
- var version = "1.2.3";
660
+ var version = "1.3.0";
659
661
  export {
660
662
  SessionHandler,
661
663
  UserSession,
@@ -1,7 +1,7 @@
1
- var U=Object.defineProperty;var P=Object.getOwnPropertySymbols;var K=Object.prototype.hasOwnProperty,M=Object.prototype.propertyIsEnumerable;var A=(t,e,r)=>e in t?U(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,b=(t,e)=>{for(var r in e||(e={}))K.call(e,r)&&A(t,r,e[r]);if(P)for(var r of P(e))M.call(e,r)&&A(t,r,e[r]);return t};function O(t){return{all:t=t||new Map,on:function(e,r){var n=t.get(e);n?n.push(r):t.set(e,[r])},off:function(e,r){var n=t.get(e);n&&(r?n.splice(n.indexOf(r)>>>0,1):t.set(e,[]))},emit:function(e,r){var n=t.get(e);n&&n.slice().map(function(o){o(r)}),(n=t.get("*"))&&n.slice().map(function(o){o(e,r)})}}}function T(t,e){return new Promise(function(r,n){try{let o=URL.createObjectURL(t),i=document.body,a=document.createElement("a");a.setAttribute("download",e),a.href=o,i.append(a),a.click(),i.removeChild(a),setTimeout(function(){URL.revokeObjectURL(o),r()},250)}catch(o){n(o)}})}async function _(t,{fileName:e,controller:r,onProgress:n}){var a,l;function o(s){typeof n=="function"&&n(b({},s))}let i=0;o({status:"requested"});try{let s=await fetch(t);if(!s.ok||!s.body){if((a=s.headers.get("content-type"))!=null&&a.includes("application/json")){let d=await s.json();if(d.error)throw new Error(d.error)}throw new Error(s.status+" "+s.statusText)}try{let d=s.body.getReader(),u=new ReadableStream({start:function(p){function f(){return d.read().then(function(E){if(E.done){p.close();return}return i+=E.value.length,o({bytesReceived:i,status:"downloading"}),p.enqueue(E.value),f()})}return f()}});s=new Response(u)}catch(d){console.warn("Failed to replace response stream to log download progress.")}let c=await s.blob();o({bytesReceived:i,status:"downloaded"}),await T(c,e),o({bytesReceived:i,status:"completed"})}catch(s){(l=r==null?void 0:r.signal)!=null&&l.aborted?o({status:"cancelled"}):o({error:s.message,status:"error"})}}function ae(t,e){return b({columns:t.getFields().map(r=>({name:r.name})),distinctRows:t.getParameter("distinctRows"),filterObject:t.getParameter("filterObject"),filterString:t.getParameter("filterString"),maxRecords:t.getParameter("maxRecords"),sortOrder:t.getParameter("sortOrder"),whereClause:t.getParameter("whereClause"),whereObject:t.getParameter("whereObject")},e)}var I={columns:[],distinctRows:!1,filterObject:null,filterString:"",maxRecords:-1,sortOrder:[],whereClause:"",whereObject:null};function J(t){var c;let{articleId:e,dataObject:r,format:n,options:o}=t,i=o?Object.assign({},I,o):I,a="data="+encodeURIComponent(JSON.stringify(i)),l=`/api/data-object/export/${e}/${r}/${n}`,s=(c=t.controller)!=null?c:new AbortController;return{controller:s,request:new Request(l,{body:a,credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST",signal:s.signal})}}function se(t){let{dataObject:e,fileName:r,format:n}=t,{request:o}=J(t);return _(o,{fileName:`${r||e}.${n}`})}function j(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var W=/^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 h(t){var e=t.toString().match(W);if(e===null)throw new TypeError("Unable to parse function!");return{name:e[1],args:e[2].split(","),body:e[3]}}function H(){}H.prototype=Object.create(null);var q=H;function S(t,e){if(typeof t=="object")if(typeof e=="string"){let r=e.split(".");return S(t,r)}else if(Array.isArray(e)){let r=t;for(let n=0;n<e.length;n++)r=r[e[n]]=r[e[n]]||new q;return r}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function L(t,e){console.warn(t)}function D(t,e){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(e))for(let r of e){let{name:n}=h(r);if(n)D(t,r);else throw new Error("Unable to detect name of function! Name it, or only supply one function and include name in first parameter.")}else{let r,n;if(typeof e=="function"&&(r=h(e).name),typeof t=="string"){let o=t.split(".");r||(r=o[o.length-1],o=o.slice(0,o.length-1)),n=S(window,o)}else if(r&&(typeof t=="object"||typeof t=="function"))n=t;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");j(n,r)?L([t,r].join(".")+" is already defined!"):n[r]=e}}async function Z(t){try{let e=await fetch("/api/user/localize",{body:JSON.stringify({string:t}),headers:{Accept:"application/json; */*","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},method:"POST"});if(e.ok)return await e.json()}catch(e){}return t}function z(t,e){var r;if(((r=af==null?void 0:af.article)==null?void 0:r.i18n)!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,t)){af.article.i18n[t]=t;let n=Z(t).then(o=>(af.article.i18n[t]=o,o));if(e)return n}return af.article.i18n[t]}else return t}var w="__UNLOCALIZED_STRINGS__",m=window[w]||new Set;window[w]||(window[w]=m);function C(){document.readyState!=="loading"&&($(),document.removeEventListener("readystatechange",C))}document.readyState!=="loading"?$():document.addEventListener("readystatechange",C);function B(){let{af:t}=window;return t&&t.userSession&&t.userSession.isDeveloper}function $(){if(B()){if(typeof window.__doNothingWithStrings=="function"){let t=window.__doNothingWithStrings();for(let e of Object.keys(t))m.add(e)}window[w]||(window[w]=m),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(t){let e=[];for(let r of m)if(r){let n=r.replace(/'/g,"\\'");if(t){let o=z(r).replaceAll(/'/g,"\\'");e.push(`'${n}': '${o}',`)}else e.push(`s['${n}'] = @Html(@context.AddLocalizableString("${r.replaceAll('"','\\"')}"));`)}return t?`// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used
1
+ window.addEventListener("error",e=>{try{let t={error:e.message??null,file:e.filename,line:e.lineno??0,column:e.colno??0,stack:null};fetch("/data/Logger/LogError",{body:JSON.stringify(t),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"})}catch{}});function v(e){return{all:e=e||new Map,on:function(t,r){var n=e.get(t);n?n.push(r):e.set(t,[r])},off:function(t,r){var n=e.get(t);n&&(r?n.splice(n.indexOf(r)>>>0,1):e.set(t,[]))},emit:function(t,r){var n=e.get(t);n&&n.slice().map(function(o){o(r)}),(n=e.get("*"))&&n.slice().map(function(o){o(t,r)})}}}function E(e,t){return new Promise(function(r,n){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),r()},250)}catch(o){n(o)}})}async function D(e,{fileName:t,controller:r,onProgress:n}){function o(a){typeof n=="function"&&n({...a})}let i=0;o({status:"requested"});try{let a=await fetch(e);if(!a.ok||!a.body){if(a.headers.get("content-type")?.includes("application/json")){let d=await a.json();if(d.error)throw new Error(d.error)}throw new Error(a.status+" "+a.statusText)}try{let d=a.body.getReader(),l=new ReadableStream({start:function(u){function c(){return d.read().then(function(f){if(f.done){u.close();return}return i+=f.value.length,o({bytesReceived:i,status:"downloading"}),u.enqueue(f.value),c()})}return c()}});a=new Response(l)}catch{console.warn("Failed to replace response stream to log download progress.")}let s=await a.blob();o({bytesReceived:i,status:"downloaded"}),await E(s,t),o({bytesReceived:i,status:"completed"})}catch(a){r?.signal?.aborted?o({status:"cancelled"}):o({error:a.message,status:"error"})}}function V(e,t){return{columns:e.getFields().map(r=>({name:r.name})),distinctRows:e.getParameter("distinctRows"),filterObject:e.getParameter("filterObject"),filterString:e.getParameter("filterString"),maxRecords:e.getParameter("maxRecords"),sortOrder:e.getParameter("sortOrder"),whereClause:e.getParameter("whereClause"),whereObject:e.getParameter("whereObject"),...t}}var N={columns:[],distinctRows:!1,filterObject:null,filterString:"",maxRecords:-1,sortOrder:[],whereClause:"",whereObject:null};function C(e){let{articleId:t,dataObject:r,format:n,options:o}=e,i=o?Object.assign({},N,o):N,a="data="+encodeURIComponent(JSON.stringify(i)),s=`/api/data-object/export/${t}/${r}/${n}`,d=e.controller??new AbortController;return{controller:d,request:new Request(s,{body:a,credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST",signal:d.signal})}}function Q(e){let{dataObject:t,fileName:r,format:n}=e,{request:o}=C(e);return D(o,{fileName:`${r||t}.${n}`})}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var k=/^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 b(e){var t=e.toString().match(k);if(t===null)throw new TypeError("Unable to parse function!");return{name:t[1],args:t[2].split(","),body:t[3]}}function P(){}P.prototype=Object.create(null);var A=P;function h(e,t){if(typeof e=="object")if(typeof t=="string"){let r=t.split(".");return h(e,r)}else if(Array.isArray(t)){let r=e;for(let n=0;n<t.length;n++)r=r[t[n]]=r[t[n]]||new A;return r}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function T(e,t){console.warn(e)}function j(e,t){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(t))for(let r of t){let{name:n}=b(r);if(n)j(e,r);else throw new Error("Unable to detect name of function! Name it, or only supply one function and include name in first parameter.")}else{let r,n;if(typeof t=="function"&&(r=b(t).name),typeof e=="string"){let o=e.split(".");r||(r=o[o.length-1],o=o.slice(0,o.length-1)),n=h(window,o)}else if(r&&(typeof e=="object"||typeof e=="function"))n=e;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");O(n,r)?T([e,r].join(".")+" is already defined!"):n[r]=t}}async function $(e){try{let t=await fetch("/api/user/localize",{body:JSON.stringify({string:e}),headers:{Accept:"application/json; */*","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},method:"POST"});if(t.ok)return await t.json()}catch{}return e}function _(e,t){if(af?.article?.i18n!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,e)){af.article.i18n[e]=e;let r=$(e).then(n=>(af.article.i18n[e]=n,n));if(t)return r}return af.article.i18n[e]}else return e}var w="__UNLOCALIZED_STRINGS__",m=window[w]||new Set;window[w]||(window[w]=m);function H(){document.readyState!=="loading"&&(I(),document.removeEventListener("readystatechange",H))}document.readyState!=="loading"?I():document.addEventListener("readystatechange",H);function F(){let{af:e}=window;return e&&e.userSession&&e.userSession.isDeveloper}function I(){if(F()){if(typeof window.__doNothingWithStrings=="function"){let e=window.__doNothingWithStrings();for(let t of Object.keys(e))m.add(t)}window[w]||(window[w]=m),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(e){let t=[];for(let r of m)if(r){let n=r.replace(/'/g,"\\'");if(e){let o=_(r).replaceAll(/'/g,"\\'");t.push(`'${n}': '${o}',`)}else t.push(`s['${n}'] = @Html(@context.AddLocalizableString("${r.replaceAll('"','\\"')}"));`)}return e?`// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used
2
2
  if (af.userSession.uiculture === 'nb-NO') {
3
3
  const strings = {
4
- ${e.join(`
4
+ ${t.join(`
5
5
  `)}
6
6
  };
7
7
  af.article.i18n = af.article.i18n || {};
@@ -12,11 +12,11 @@ function __doNothingWithStrings() {
12
12
  var context = @Appframe.Web.Context.RequestContext.Current;
13
13
  }
14
14
  let s = {};
15
- ${e.join(`
15
+ ${t.join(`
16
16
  `)}
17
17
  return s;
18
18
  }
19
- <\/script>`})}}function y(t){let e=z(t);return e===t&&!m.has(t)&&m.add(t),e}function k(t){var e;return[((e=af==null?void 0:af.article)==null?void 0:e.id)||"","common",t].join(".")}var R=class{isPersisted(){return!0}getLocalStorageKey(e,r){return r?["common",e].join("."):k(e)}get(e,r,n){let o=this.getLocalStorageKey(e,n),i=localStorage.getItem(o);return i!==null?JSON.parse(i):r}set(e,r,n){localStorage.setItem(this.getLocalStorageKey(e,n),JSON.stringify(r))}remove(e,r){let n=this.getLocalStorageKey(e,r);return localStorage.getItem(n)!==null?(localStorage.removeItem(n),!0):!1}clear(){let e=k("");for(let r in localStorage)r.slice(0,e.length)===e&&localStorage.removeItem(r)}},G=new R;var x=class{constructor(){this.eventHandler=O();this.showingDialog=!1;this.dialog=null}expired(e){if(af.userSession=af.userSession||{login:null},typeof e!="function")throw new TypeError("Parameter pCallback passed to the expired function must be a function!");let r=()=>{this.detachEvent("onAuthenticated",r),e()};if(this.attachEvent("onAuthenticated",r),this.showingDialog!==!0){this.showingDialog=!0;let n=document.createElement("div");n.className="session-expired-container",n.innerHTML=`
19
+ <\/script>`})}}function y(e){let t=_(e);return t===e&&!m.has(e)&&m.add(e),t}function q(e){return[af?.article?.id||"","common",e].join(".")}var L=class{isPersisted(){return!0}getLocalStorageKey(t,r){return r?["common",t].join("."):q(t)}get(t,r,n){let o=this.getLocalStorageKey(t,n),i=localStorage.getItem(o);return i!==null?JSON.parse(i):r}set(t,r,n){localStorage.setItem(this.getLocalStorageKey(t,n),JSON.stringify(r))}remove(t,r){let n=this.getLocalStorageKey(t,r);return localStorage.getItem(n)!==null?(localStorage.removeItem(n),!0):!1}clear(){let t=q("");for(let r in localStorage)r.slice(0,t.length)===t&&localStorage.removeItem(r)}},M=new L;var S=class{constructor(){this.eventHandler=v();this.showingDialog=!1;this.dialog=null}expired(t){if(af.userSession=af.userSession||{login:null},typeof t!="function")throw new TypeError("Parameter pCallback passed to the expired function must be a function!");let r=()=>{this.detachEvent("onAuthenticated",r),t()};if(this.attachEvent("onAuthenticated",r),this.showingDialog!==!0){this.showingDialog=!0;let n=document.createElement("div");n.className="session-expired-container",n.innerHTML=`
20
20
  <div class="session-expired-log-in" style="margin-top: 20px;">
21
21
  <div class="row">
22
22
  <div class="sessionExpired">
@@ -44,5 +44,5 @@ return s;
44
44
  </div>
45
45
  </div>
46
46
  </div>
47
- `;let o=af.userSession.login?x.messages.relog:x.messages.login,i=n.querySelector(".message"),a=n.querySelector(".alert-warning"),l=n.querySelector("input[type=text]"),s=n.querySelector(".sign-in"),c=n.querySelector("input[type=password]");if(i!==null&&l!==null&&a!==null&&l!==null&&s!==null&&c!==null){i.innerText=y(o),l.value=af.userSession.login||"",l.disabled=!!af.userSession.login,l.readOnly=!!af.userSession.login,document.body.appendChild(n);let d=async()=>{c.disabled=!0;let u=new Request("/login",{body:JSON.stringify({username:l.value,password:c.value,remember:!1}),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"});try{let f=await(await fetch(u)).json();if(f.success)document.body.removeChild(n),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),a.parentNode&&(a.parentNode.style.display="none");else throw new Error(f.error)}catch(p){if(p&&typeof p=="object"){let f=p;c.disabled=!1,c.classList.toggle("invalid",!0),c.value="",c.focus(),a.innerText=f.message?f.message:String(f),a.parentNode&&(a.parentNode.style.display="initial")}}};s.addEventListener("click",d),c.addEventListener("keyup",u=>{u.key==="Enter"&&d()}),c.addEventListener("change",u=>{u.key==="Enter"&&d()}),l.addEventListener("keyup",u=>{u.key==="Enter"&&d()}),l.addEventListener("change",u=>{u.key==="Enter"&&d()}),c.focus()}}}attachEvent(e,r){return this.eventHandler.on(e,r)}detachEvent(e,r){return this.eventHandler.off(e,r)}},g=x;g.messages={login:"Log in",relog:"Session expired - log in"};var v=class extends g{constructor(r){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,r)}};function V(t,e){if(t==="")return null;if(e==="number"){let r=Number(t);return isNaN(r)?void 0:r}else if(["date","datetime","time"].includes(e)){let r=new Date(t);return isNaN(r.getTime())?void 0:r}else{if(e==="boolean")return t.toLowerCase()==="true";if(e==="bigint")return BigInt(t)}return t}function N(t,e={}){var o;let r=new FormData(t),n={};for(let i of r.entries()){let a=i[0],l=(o=e==null?void 0:e[a])!=null?o:"string",s=V(i[1],l);n.hasOwnProperty(a)?Array.isArray(n[a])?n[a].push(s):n[a]=[n[a],s]:n[a]=s}return n}function X(t,e){let r=e.getFields(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return N(t,n)}function Q(t,e){let r=e.getParameters(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return N(t,n)}function F(t){return`${t||af.article.id}.${af.userSession.login}`}function Re(t,e){if(!(af!=null&&af.userSession))return null;let r=F(e),n=JSON.parse(localStorage.getItem(r)||"{}");return t?n[t]||null:n}function Ne(t,e,r){if(!(af!=null&&af.userSession))return;let n=F(r),o=JSON.parse(localStorage.getItem(n)||"{}");typeof e!="undefined"?o[t]=e:o=t,localStorage.setItem(n,JSON.stringify(o))}var Ae="1.2.3";export{g as SessionHandler,v as UserSession,T as downloadBlob,_ as downloadRequest,ae as exportOptionsFromDataObject,D as expose,X as formDataToDataObjectRecord,N as formDataToObject,Q as formDataToProcedureParameters,J as getDataObjectReportRequest,y as getLocalizedString,Re as getSettings,G as localStorage,O as mitt,se as openDataObjectReport,Ne as saveSettings,Ae as version};
47
+ `;let o=af.userSession.login?S.messages.relog:S.messages.login,i=n.querySelector(".message"),a=n.querySelector(".alert-warning"),s=n.querySelector("input[type=text]"),d=n.querySelector(".sign-in"),l=n.querySelector("input[type=password]");if(i!==null&&s!==null&&a!==null&&s!==null&&d!==null&&l!==null){i.innerText=y(o),s.value=af.userSession.login||"",s.disabled=!!af.userSession.login,s.readOnly=!!af.userSession.login,document.body.appendChild(n);let u=async()=>{l.disabled=!0;let c=new Request("/login",{body:JSON.stringify({username:s.value,password:l.value,remember:!1}),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"});try{let g=await(await fetch(c)).json();if(g.success)document.body.removeChild(n),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),a.parentNode&&(a.parentNode.style.display="none");else throw new Error(g.error)}catch(f){if(f&&typeof f=="object"){let g=f;l.disabled=!1,l.classList.toggle("invalid",!0),l.value="",l.focus(),a.innerText=g.message?g.message:String(g),a.parentNode&&(a.parentNode.style.display="initial")}}};d.addEventListener("click",u),l.addEventListener("keyup",c=>{c.key==="Enter"&&u()}),l.addEventListener("change",c=>{c.key==="Enter"&&u()}),s.addEventListener("keyup",c=>{c.key==="Enter"&&u()}),s.addEventListener("change",c=>{c.key==="Enter"&&u()}),l.focus()}}}attachEvent(t,r){return this.eventHandler.on(t,r)}detachEvent(t,r){return this.eventHandler.off(t,r)}},p=S;p.messages={login:"Log in",relog:"Session expired - log in"};var x=class extends p{constructor(r){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,r)}};function U(e,t){if(e==="")return null;if(t==="number"){let r=Number(e);return isNaN(r)?void 0:r}else if(["date","datetime","time"].includes(t)){let r=new Date(e);return isNaN(r.getTime())?void 0:r}else{if(t==="boolean")return e.toLowerCase()==="true";if(t==="bigint")return BigInt(e)}return e}function R(e,t={}){let r=new FormData(e),n={};for(let o of r.entries()){let i=o[0],a=t?.[i]??"string",s=U(o[1],a);n.hasOwnProperty(i)?Array.isArray(n[i])?n[i].push(s):n[i]=[n[i],s]:n[i]=s}return n}function K(e,t){let r=t.getFields(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return R(e,n)}function J(e,t){let r=t.getParameters(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return R(e,n)}function z(e){return`${e||af.article.id}.${af.userSession.login}`}function xe(e,t){if(!af?.userSession)return null;let r=z(t),n=JSON.parse(localStorage.getItem(r)||"{}");return e?n[e]||null:n}function ve(e,t,r){if(!af?.userSession)return;let n=z(r),o=JSON.parse(localStorage.getItem(n)||"{}");typeof t<"u"?o[e]=t:o=e,localStorage.setItem(n,JSON.stringify(o))}var Te="1.3.0";export{p as SessionHandler,x as UserSession,E as downloadBlob,D as downloadRequest,V as exportOptionsFromDataObject,j as expose,K as formDataToDataObjectRecord,R as formDataToObject,J as formDataToProcedureParameters,C as getDataObjectReportRequest,y as getLocalizedString,xe as getSettings,M as localStorage,v as mitt,Q as openDataObjectReport,ve as saveSettings,Te as version};
48
48
  //# sourceMappingURL=af.common.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../../node_modules/mitt/src/index.ts", "../../src/downloadBlob.ts", "../../src/downloadRequest.ts", "../../src/exportDataObject.ts", "../../src/has.ts", "../../src/parseFunc.ts", "../../src/Namespace.ts", "../../src/requireNamespace.ts", "../../src/warn.ts", "../../src/expose.ts", "../../src/getLocalizedString.ts", "../../src/localStorage.ts", "../../src/SessionHandler.ts", "../../src/UserSession.ts", "../../src/formDataToObject.ts", "../../src/settings.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", "export function downloadBlob(blob: Blob | MediaSource, fileName: string) {\n return new Promise<void>(function (resolve, reject) {\n try {\n const url = URL.createObjectURL(blob);\n const parent = document.body;\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"download\", fileName);\n anchor.href = url;\n parent.append(anchor);\n anchor.click();\n parent.removeChild(anchor);\n\n setTimeout(function () {\n URL.revokeObjectURL(url);\n resolve();\n }, 250);\n } catch (ex) {\n reject(ex);\n }\n });\n}\n", "import { downloadBlob } from \"./downloadBlob.js\";\n\nexport type DownloadItem = {\n status: \"cancelled\" | \"error\" | \"requested\" | \"downloading\" | \"downloaded\" | \"completed\";\n bytesReceived?: number;\n error?: string;\n};\n\nexport type DownloadParameters = {\n controller?: AbortController;\n fileName: string;\n onProgress?: (progress: DownloadItem) => void;\n};\n\nexport async function downloadRequest(request: Request, { fileName, controller, onProgress }: DownloadParameters) {\n function reportProgress(progress: DownloadItem) {\n if (typeof onProgress === \"function\") {\n onProgress({ ...progress });\n }\n }\n\n let bytesReceived = 0;\n\n reportProgress({ status: \"requested\" });\n\n try {\n let response = await fetch(request);\n\n if (!response.ok || !response.body) {\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n let data = await response.json();\n if (data.error) {\n throw new Error(data.error);\n }\n }\n throw new Error(response.status + \" \" + response.statusText);\n }\n\n try {\n const reader = response.body.getReader();\n const stream = new ReadableStream({\n start: function (controller) {\n function pump(): Promise<void> {\n return reader.read().then(function (read) {\n if (read.done) {\n controller.close();\n return;\n }\n\n bytesReceived += read.value.length;\n reportProgress({ bytesReceived, status: \"downloading\" });\n controller.enqueue(read.value);\n\n return pump();\n });\n }\n\n return pump();\n },\n });\n\n response = new Response(stream);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to replace response stream to log download progress.\");\n }\n\n const blob = await response.blob();\n\n reportProgress({ bytesReceived, status: \"downloaded\" });\n\n await downloadBlob(blob, fileName);\n\n reportProgress({ bytesReceived, status: \"completed\" });\n } catch (err) {\n if (controller?.signal?.aborted) {\n reportProgress({ status: \"cancelled\" });\n } else {\n reportProgress({ error: (err as Error).message, status: \"error\" });\n }\n }\n}\n", "import { DataObject, DataObjectOptions } from \"@olenbetong/appframe-data\";\nimport { RetrieveParameters } from \"@olenbetong/appframe-data\";\n\nimport { downloadRequest } from \"./downloadRequest.js\";\n\nexport type DataExportColumn = {\n name: string;\n caption?: string;\n cellFormat?: string;\n format?: string;\n};\n\nexport type DataExportOptions = RetrieveParameters<any> & { columns: DataExportColumn[] };\nexport type DataObjectReportParams = {\n articleId: string;\n controller?: AbortController;\n dataObject: string;\n format: \"pdf\" | \"xlsx\" | \"csv\" | \"xls\";\n fileName?: string;\n options: DataExportOptions;\n id?: string;\n title?: string;\n subTitle?: string;\n /**\n * Whether the title should be shown in the exported file (default true)\n */\n includeTitle?: boolean;\n /**\n * Whether the filter should be shown in the exported file (default true)\n */\n includefilter?: boolean;\n /**\n * Whether we should try to convert from camelCase to human readable names (default true)\n */\n formatHeaders?: boolean;\n /**\n * Whether the header should be frozen on top of the excel file.\n */\n freezeHeader?: boolean;\n};\n\n/**\n * Get columns and retrieve parameters from a data object to be used to create a report.\n * @param dataObject Data object to get parameters and columns from\n * @param specifiedOptions Options to override the data object options\n * @returns\n */\nexport function exportOptionsFromDataObject(\n dataObject: DataObject<any>,\n specifiedOptions: Partial<DataObjectOptions<any>>\n) {\n return {\n columns: dataObject.getFields().map((field) => ({ name: field.name })),\n distinctRows: dataObject.getParameter(\"distinctRows\"),\n filterObject: dataObject.getParameter(\"filterObject\"),\n filterString: dataObject.getParameter(\"filterString\"),\n maxRecords: dataObject.getParameter(\"maxRecords\"),\n sortOrder: dataObject.getParameter(\"sortOrder\"),\n whereClause: dataObject.getParameter(\"whereClause\"),\n whereObject: dataObject.getParameter(\"whereObject\"),\n ...specifiedOptions,\n };\n}\n\nconst defaultOptions: DataExportOptions = {\n columns: [],\n distinctRows: false,\n filterObject: null,\n filterString: \"\",\n maxRecords: -1,\n sortOrder: [],\n whereClause: \"\",\n whereObject: null,\n};\n\n/**\n * Get a request object to download a report from a data object.\n * @param params Parameters to use to create a report\n * @returns Request object for the report\n */\nexport function getDataObjectReportRequest(params: DataObjectReportParams) {\n const { articleId, dataObject, format, options } = params;\n const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;\n const body = \"data=\" + encodeURIComponent(JSON.stringify(reportOptions));\n const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;\n\n const controller = params.controller ?? new AbortController();\n\n return {\n controller,\n request: new Request(requestUrl, {\n body,\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n signal: controller.signal,\n }),\n };\n}\n\nexport function openDataObjectReport(params: DataObjectReportParams) {\n const { dataObject, fileName, format } = params;\n const { request } = getDataObjectReportRequest(params);\n\n return downloadRequest(request, {\n fileName: `${fileName || dataObject}.${format}`,\n });\n}\n", "export default function has(\n obj: any,\n key: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "const funcRegex = /^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 default function parseFunc(func: Function) {\n var match = func.toString().match(funcRegex);\n if (match === null) {\n throw new TypeError(\"Unable to parse function!\");\n }\n return { 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 default function requireNamespace(\n root: any,\n namespace: string | Array<string>\n): any {\n if (typeof root === \"object\") {\n if (typeof namespace === \"string\") {\n let path = namespace.split(\".\");\n\n return requireNamespace(root, path);\n } else if (Array.isArray(namespace)) {\n let current: any = root;\n for (let i = 0; i < namespace.length; i++) {\n current = current[namespace[i]] =\n current[namespace[i]] || new (Namespace as any)();\n }\n\n return current;\n } else {\n throw new TypeError(\"Invalid type of parameter 'namespace'\");\n }\n } else {\n throw new TypeError(\"Invalid type of parameter 'root'\");\n }\n}\n", "/* eslint-disable no-console */\nexport default function warn(message: string, fallbackToAlert?: boolean) {\n console.warn(message);\n}\n", "import has from \"./has.js\";\nimport parseFunc from \"./parseFunc.js\";\nimport requireNamespace from \"./requireNamespace.js\";\nimport warn from \"./warn.js\";\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 default function expose(\n name: object | string,\n value: object | Function | Function[]\n): void {\n if (arguments.length !== 2) {\n throw new Error(\n \"Incorrect number of arguments passed to the expose function!\"\n );\n }\n\n if (Array.isArray(value)) {\n for (let func of value) {\n const { name: funcName } = parseFunc(func);\n\n if (funcName) {\n expose(name, func); // Expose func on namespace found in pName\n } else {\n throw new Error(\n \"Unable to detect name of function! Name it, or only supply one function and include name in first parameter.\"\n );\n }\n }\n } else {\n let keyName: string | undefined;\n let namespace;\n\n if (typeof value === \"function\") {\n keyName = parseFunc(value).name;\n }\n\n if (typeof name === \"string\") {\n let pathParts = name.split(\".\");\n\n if (!keyName) {\n keyName = pathParts[pathParts.length - 1];\n pathParts = pathParts.slice(0, pathParts.length - 1);\n }\n\n namespace = requireNamespace(window, pathParts);\n } else if (\n keyName &&\n (typeof name === \"object\" || typeof name === \"function\")\n ) {\n namespace = name;\n } else {\n throw new TypeError(\n \"Invalid typeof parameter 'name', or unable to parse pValue!\"\n );\n }\n\n if (has(namespace, keyName)) {\n // If class is already defined, warn or show an alert\n warn([name, keyName].join(\".\") + \" is already defined!\");\n } else {\n namespace[keyName] = value;\n }\n }\n}\n", "async function getLocalizedStringAsync(string: string) {\n try {\n let response = await fetch(\"/api/user/localize\", {\n body: JSON.stringify({ string }),\n headers: {\n Accept: \"application/json; */*\",\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n method: \"POST\",\n });\n\n if (response.ok) {\n return (await response.json()) as string;\n }\n } catch (error) {}\n\n return string;\n}\n\nfunction afGetLocalizedString(string: string): string;\nfunction afGetLocalizedString(string: string, wait: false): string;\nfunction afGetLocalizedString(string: string, wait: true): Promise<string>;\nfunction afGetLocalizedString(\n string: string,\n wait?: boolean\n): string | Promise<string> {\n if (af?.article?.i18n !== undefined) {\n if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {\n af.article.i18n[string] = string;\n\n let promise = getLocalizedStringAsync(string).then((text) => {\n af.article.i18n[string] = text;\n return text;\n });\n\n if (wait) {\n return promise;\n }\n }\n\n return af.article.i18n[string];\n } else {\n return string;\n }\n}\n\ndeclare global {\n interface Window {\n __UNLOCALIZED_STRINGS__: Set<string>;\n __doNothingWithStrings?: () => Record<string, string>;\n __getUnlocalizedStrings?: (forCustomRoute?: boolean) => string;\n }\n}\n\nconst key = \"__UNLOCALIZED_STRINGS__\";\nconst localizeSet = window[key] || new Set();\n\nif (!window[key]) {\n window[key] = localizeSet;\n}\n\nfunction handleReadyStateChange() {\n if (document.readyState !== \"loading\") {\n addDeveloperUtils();\n document.removeEventListener(\"readystatechange\", handleReadyStateChange);\n }\n}\n\nif (document.readyState !== \"loading\") {\n addDeveloperUtils();\n} else {\n document.addEventListener(\"readystatechange\", handleReadyStateChange);\n}\n\nfunction isDeveloper() {\n const { af } = window;\n\n return af && af.userSession && af.userSession.isDeveloper;\n}\n\nfunction addDeveloperUtils() {\n if (isDeveloper()) {\n if (typeof window.__doNothingWithStrings === \"function\") {\n const addedStrings = window.__doNothingWithStrings();\n\n for (let string of Object.keys(addedStrings)) {\n localizeSet.add(string);\n }\n }\n\n if (!window[key]) {\n window[key] = localizeSet;\n }\n\n if (!window.__getUnlocalizedStrings) {\n window.__getUnlocalizedStrings = function (forCustomRoute) {\n const strings = [];\n\n for (let string of localizeSet) {\n if (string) {\n const escaped = string.replace(/'/g, \"\\\\'\");\n if (forCustomRoute) {\n const localized = afGetLocalizedString(string).replaceAll(\n /'/g,\n \"\\\\'\"\n );\n strings.push(`'${escaped}': '${localized}',`);\n } else {\n strings.push(\n `s['${escaped}'] = @Html(@context.AddLocalizableString(\"${string.replaceAll(\n '\"',\n '\\\\\"'\n )}\"));`\n );\n }\n }\n }\n\n if (forCustomRoute) {\n return `// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used\nif (af.userSession.uiculture === 'nb-NO') {\n\tconst strings = {\n\t\t${strings.join(\"\\n\\t\\t\")}\n\t};\n\taf.article.i18n = af.article.i18n || {};\n\tObject.assign(af.article.i18n, strings);\n}`;\n }\n\n return `<script type=\"text/javascript\">\nfunction __doNothingWithStrings() {\n@{\n\tvar context = @Appframe.Web.Context.RequestContext.Current;\n}\nlet s = {};\n${strings.join(\"\\n\")}\nreturn s;\n}\n</script>`;\n };\n }\n }\n}\n\nexport function getLocalizedString(string: string) {\n const localized = afGetLocalizedString(string);\n if (localized === string && !localizeSet.has(string)) {\n localizeSet.add(string);\n }\n\n return localized;\n}\n", "function getLocalKey(key: string): string {\n return [af?.article?.id || \"\", \"common\", key].join(\".\");\n}\n\nclass LocalStorage {\n isPersisted() {\n return true;\n }\n\n getLocalStorageKey(key: string, global?: boolean) {\n return global ? [\"common\", key].join(\".\") : getLocalKey(key);\n }\n\n get(key: string, defaultValue: unknown, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n const value = localStorage.getItem(lsKey);\n\n return value !== null ? JSON.parse(value) : defaultValue;\n }\n\n set(key: string, value: unknown, global?: boolean) {\n localStorage.setItem(\n this.getLocalStorageKey(key, global),\n JSON.stringify(value)\n );\n }\n\n remove(key: string, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n if (localStorage.getItem(lsKey) !== null) {\n localStorage.removeItem(lsKey);\n return true;\n } else {\n return false;\n }\n }\n\n clear() {\n const baseKey = getLocalKey(\"\");\n\n for (let key in localStorage) {\n if (key.slice(0, baseKey.length) === baseKey) {\n localStorage.removeItem(key);\n }\n }\n }\n}\n\nexport default new LocalStorage();\n", "import mitt, { Emitter, Handler } from \"mitt\";\nimport { getLocalizedString } from \"./getLocalizedString.js\";\n\ntype SessionHandlerEvent = \"onExpired\" | \"onAuthenticated\";\n\nexport default class SessionHandler {\n static messages = {\n login: \"Log in\",\n relog: \"Session expired - log in\"\n };\n\n private eventHandler: Emitter<{ onAuthenticated: void; onExpired: void }> = mitt();\n private showingDialog = false;\n private dialog = null;\n\n expired(callback: Function) {\n af.userSession = af.userSession || {\n login: null\n };\n\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Parameter pCallback passed to the expired function must be a function!\");\n }\n\n const once = () => {\n this.detachEvent(\"onAuthenticated\", once);\n callback();\n };\n\n this.attachEvent(\"onAuthenticated\", once);\n\n if (this.showingDialog !== true) {\n this.showingDialog = true;\n const contentContainer = document.createElement(\"div\");\n contentContainer.className = \"session-expired-container\";\n contentContainer.innerHTML = `\n<div class=\"session-expired-log-in\" style=\"margin-top: 20px;\">\n <div class=\"row\">\n <div class=\"sessionExpired\">\n <h4 class=\"message\">Frakoblet - tidsavbrudd</h4>\n <div class=\"form-group\">\n <label for=\"username\">${getLocalizedString(\"Username\")}</label>\n <input type=\"text\" class=\"form-control\" id=\"username\" autofocus>\n </div>\n <div class=\"form-group\">\n <label for=\"password\">${getLocalizedString(\"Password\")}</label>\n <input type=\"password\" autocomplete=\"password\" class=\"form-control\" id=\"password\" >\n </div>\n <div class=\"form-group\">\n <div>\n <button type=\"submit\" class=\"btn btn-default sign-in\">\n ${getLocalizedString(\"Log in\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"\" style=\"display:none; margin: 0px 30px;\">\n <div class=\"alert alert-warning\" role=\"alert\" style=\"margin-top:10px;\"></div> \n </div>\n </div>\n</div>\n`;\n const message = af.userSession.login ? SessionHandler.messages.relog : SessionHandler.messages.login;\n\n const messageElem = contentContainer.querySelector(\".message\") as HTMLHeadingElement;\n const statusElem = contentContainer.querySelector(\".alert-warning\") as HTMLDivElement;\n const userElem = contentContainer.querySelector(\"input[type=text]\") as HTMLInputElement;\n const signInElem = contentContainer.querySelector(\".sign-in\") as HTMLButtonElement;\n const passwordElem = contentContainer.querySelector(\"input[type=password]\") as HTMLInputElement;\n\n if (\n messageElem !== null &&\n userElem !== null &&\n statusElem !== null &&\n userElem !== null &&\n signInElem !== null &&\n passwordElem !== null\n ) {\n messageElem.innerText = getLocalizedString(message);\n\n userElem.value = af.userSession.login || \"\";\n userElem.disabled = !!af.userSession.login;\n userElem.readOnly = !!af.userSession.login;\n\n document.body.appendChild(contentContainer);\n\n const doLogin = async () => {\n passwordElem.disabled = true;\n\n const request = new Request(\"/login\", {\n body: JSON.stringify({\n username: userElem.value,\n password: passwordElem.value,\n remember: false\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n method: \"POST\"\n });\n\n try {\n const response = await fetch(request);\n const json = await response.json();\n\n if (json.success) {\n document.body.removeChild(contentContainer);\n this.showingDialog = false;\n this.eventHandler.emit(\"onAuthenticated\");\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"none\";\n }\n } else {\n throw new Error(json.error);\n }\n } catch (err) {\n if (err && typeof err === \"object\") {\n let error = err as Error;\n passwordElem.disabled = false;\n passwordElem.classList.toggle(\"invalid\", true);\n passwordElem.value = \"\";\n passwordElem.focus();\n statusElem.innerText = error.message ? error.message : String(error);\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"initial\";\n }\n }\n }\n };\n\n signInElem.addEventListener(\"click\", doLogin);\n\n passwordElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.focus();\n }\n }\n }\n\n attachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.on(eventName, handler);\n }\n\n detachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.off(eventName, handler);\n }\n}\n", "import SessionHandler from \"./SessionHandler.js\";\n\nexport default class UserSession extends SessionHandler {\n decimalSeparator: string = \".\";\n formats: any;\n groupSeparator: string | null = null;\n shortDateFormat: string = \"dd.MM.yyyy\";\n login: string | null = null;\n isDeveloper: boolean = false;\n\n constructor(userData: any) {\n super();\n this.formats = {};\n Object.assign(this, userData);\n }\n}\n", "import type { DataObject, Procedure } from \"@olenbetong/appframe-data\";\n\nfunction getFormValue(value: string, type: string): string | number | boolean | Date | BigInt | null | undefined {\n if (value === \"\") {\n return null;\n } else if (type === \"number\") {\n let numValue = Number(value);\n\n return isNaN(numValue) ? undefined : numValue;\n } else if ([\"date\", \"datetime\", \"time\"].includes(type)) {\n let dateValue = new Date(value);\n\n return isNaN(dateValue.getTime()) ? undefined : dateValue;\n } else if (type === \"boolean\") {\n return value.toLowerCase() === \"true\";\n } else if (type === \"bigint\") {\n return BigInt(value);\n }\n\n return value;\n}\n\n/**\n * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.\n * @param form HTML form element to get form data from.\n * @param typeMap A mapping from field name to field type\n * @returns\n */\nexport function formDataToObject<T = any>(form: HTMLFormElement, typeMap: Record<string, string> = {}): Partial<T> {\n let formData = new FormData(form);\n let result: any = {};\n\n for (let entry of formData.entries()) {\n let field = entry[0];\n let type = typeMap?.[field] ?? \"string\";\n let value = getFormValue(entry[1] as string, type);\n\n if (result.hasOwnProperty(field)) {\n if (Array.isArray(result[field])) {\n result[field].push(value);\n } else {\n result[field] = [result[field], value];\n }\n } else {\n result[field] = value;\n }\n }\n\n return result as T;\n}\n\n/**\n * Creates a partial data object record from form data. The name property is mapped\n * to field name.\n *\n * @param form HTML form element to get FormData from\n * @param dataObject Data object for which to create a record from the form data\n * @returns {Partial<T>} Partial data object record\n */\nexport function formDataToDataObjectRecord<T>(form: HTMLFormElement, dataObject: DataObject<T>): Partial<T> {\n let fields = dataObject.getFields();\n let types = Object.fromEntries(fields.map((field) => [field.name, field.type])) as Record<string, string>;\n\n return formDataToObject<T>(form, types);\n}\n\n/**\n * Creates procedure parameters from form data. The name property is mapped\n * to parameter names.\n *\n * @param form HTML Form element to get FormData from\n * @param procedure Appframe Procedure to create parameters for\n * @returns\n */\nexport function formDataToProcedureParameters<T>(form: HTMLFormElement, procedure: Procedure<T, any>): T {\n let parameters = procedure.getParameters();\n let types = Object.fromEntries(parameters.map((param) => [param.name, param.type])) as Record<string, string>;\n\n return formDataToObject(form, types) as T;\n}\n", "function getKey(article?: string) {\n const articleKey = article || af.article.id;\n return `${articleKey}.${af.userSession.login}`;\n}\n\nexport function getSettings<T>(setting: string, article?: string): T | null {\n if (!af?.userSession) return null;\n\n const key = getKey(article);\n const settings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (setting) {\n return settings[setting] || null;\n }\n\n return settings;\n}\n\nexport function saveSettings<T>(\n setting: string,\n value: T | null,\n article?: string\n): void {\n if (!af?.userSession) return;\n\n const key = getKey(article);\n let userSettings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (typeof value !== \"undefined\") {\n userSettings[setting] = value;\n } else {\n userSettings = setting;\n }\n\n localStorage.setItem(key, JSON.stringify(userSettings));\n}\n", "export { default as mitt } from \"mitt\";\nexport { downloadBlob } from \"./downloadBlob.js\";\nexport * from \"./downloadRequest.js\";\nexport * from \"./exportDataObject.js\";\nexport { default as expose } from \"./expose.js\";\nexport { getLocalizedString } from \"./getLocalizedString.js\";\nexport { default as localStorage } from \"./localStorage.js\";\nexport { default as SessionHandler } from \"./SessionHandler.js\";\nexport { default as UserSession } from \"./UserSession.js\";\nexport { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from \"./formDataToObject.js\";\nexport * from \"./settings.js\";\nexport const version = __VERSION__;\n"],
5
- "mappings": "oWAuCCA,EAAAA,CAOA,MAAO,CAKNA,IAPDA,EAAMA,GAAO,IAAIC,IAehBC,GAAAA,SAA6BC,EAAWC,EAAAA,CACvC,IAAMC,EAAmDL,EAAKM,IAAIH,CAAAA,EAC9DE,EACHA,EAASE,KAAKH,CAAAA,EAGdJ,EAAKQ,IAAIL,EAAM,CAACC,CAAAA,CAAAA,CAAAA,EAWlBK,IAAAA,SAA8BN,EAAWC,EAAAA,CACxC,IAAMC,EAAmDL,EAAKM,IAAIH,CAAAA,EAC9DE,IACCD,EACHC,EAASK,OAAOL,EAASM,QAAQP,CAAAA,IAAa,EAAG,CAAA,EAGjDJ,EAAKQ,IAAIL,EAAM,CAAA,CAAA,EAAA,EAelBS,KAAAA,SAA+BT,EAAWU,EAAAA,CACzC,IAAIR,EAAWL,EAAKM,IAAIH,CAAAA,EACpBE,GACFA,EACCS,MAAAA,EACAC,IAAI,SAACX,EAAAA,CACLA,EAAQS,CAAAA,CAAAA,CAAAA,GAIXR,EAAWL,EAAKM,IAAI,GAAA,IAElBD,EACCS,MAAAA,EACAC,IAAI,SAACX,EAAAA,CACLA,EAAQD,EAAMU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CCjHb,SAASG,EAAaC,EAA0BC,EAAkB,CACvE,OAAO,IAAI,QAAc,SAAUC,EAASC,EAAQ,CAClD,GAAI,CACF,IAAMC,EAAM,IAAI,gBAAgBJ,CAAI,EAC9BK,EAAS,SAAS,KAClBC,EAAS,SAAS,cAAc,GAAG,EACzCA,EAAO,aAAa,WAAYL,CAAQ,EACxCK,EAAO,KAAOF,EACdC,EAAO,OAAOC,CAAM,EACpBA,EAAO,MAAM,EACbD,EAAO,YAAYC,CAAM,EAEzB,WAAW,UAAY,CACrB,IAAI,gBAAgBF,CAAG,EACvBF,EAAQ,CACV,EAAG,GAAG,CACR,OAASK,EAAP,CACAJ,EAAOI,CAAE,CACX,CACF,CAAC,CACH,CCNA,eAAsBC,EAAgBC,EAAkB,CAAE,SAAAC,EAAU,WAAAC,EAAY,WAAAC,CAAW,EAAuB,CAdlH,IAAAC,EAAAC,EAeE,SAASC,EAAeC,EAAwB,CAC1C,OAAOJ,GAAe,YACxBA,EAAWK,EAAA,GAAKD,EAAU,CAE9B,CAEA,IAAIE,EAAgB,EAEpBH,EAAe,CAAE,OAAQ,WAAY,CAAC,EAEtC,GAAI,CACF,IAAII,EAAW,MAAM,MAAMV,CAAO,EAElC,GAAI,CAACU,EAAS,IAAM,CAACA,EAAS,KAAM,CAClC,IAAIN,EAAAM,EAAS,QAAQ,IAAI,cAAc,IAAnC,MAAAN,EAAsC,SAAS,oBAAqB,CACtE,IAAIO,EAAO,MAAMD,EAAS,KAAK,EAC/B,GAAIC,EAAK,MACP,MAAM,IAAI,MAAMA,EAAK,KAAK,CAE9B,CACA,MAAM,IAAI,MAAMD,EAAS,OAAS,IAAMA,EAAS,UAAU,CAC7D,CAEA,GAAI,CACF,IAAME,EAASF,EAAS,KAAK,UAAU,EACjCG,EAAS,IAAI,eAAe,CAChC,MAAO,SAAUX,EAAY,CAC3B,SAASY,GAAsB,CAC7B,OAAOF,EAAO,KAAK,EAAE,KAAK,SAAUG,EAAM,CACxC,GAAIA,EAAK,KAAM,CACbb,EAAW,MAAM,EACjB,MACF,CAEA,OAAAO,GAAiBM,EAAK,MAAM,OAC5BT,EAAe,CAAE,cAAAG,EAAe,OAAQ,aAAc,CAAC,EACvDP,EAAW,QAAQa,EAAK,KAAK,EAEtBD,EAAK,CACd,CAAC,CACH,CAEA,OAAOA,EAAK,CACd,CACF,CAAC,EAEDJ,EAAW,IAAI,SAASG,CAAM,CAChC,OAASG,EAAP,CAEA,QAAQ,KAAK,6DAA6D,CAC5E,CAEA,IAAMC,EAAO,MAAMP,EAAS,KAAK,EAEjCJ,EAAe,CAAE,cAAAG,EAAe,OAAQ,YAAa,CAAC,EAEtD,MAAMS,EAAaD,EAAMhB,CAAQ,EAEjCK,EAAe,CAAE,cAAAG,EAAe,OAAQ,WAAY,CAAC,CACvD,OAASU,EAAP,EACId,EAAAH,GAAA,YAAAA,EAAY,SAAZ,MAAAG,EAAoB,QACtBC,EAAe,CAAE,OAAQ,WAAY,CAAC,EAEtCA,EAAe,CAAE,MAAQa,EAAc,QAAS,OAAQ,OAAQ,CAAC,CAErE,CACF,CClCO,SAASC,GACdC,EACAC,EACA,CACA,OAAOC,EAAA,CACL,QAASF,EAAW,UAAU,EAAE,IAAKG,IAAW,CAAE,KAAMA,EAAM,IAAK,EAAE,EACrE,aAAcH,EAAW,aAAa,cAAc,EACpD,aAAcA,EAAW,aAAa,cAAc,EACpD,aAAcA,EAAW,aAAa,cAAc,EACpD,WAAYA,EAAW,aAAa,YAAY,EAChD,UAAWA,EAAW,aAAa,WAAW,EAC9C,YAAaA,EAAW,aAAa,aAAa,EAClD,YAAaA,EAAW,aAAa,aAAa,GAC/CC,EAEP,CAEA,IAAMG,EAAoC,CACxC,QAAS,CAAC,EACV,aAAc,GACd,aAAc,KACd,aAAc,GACd,WAAY,GACZ,UAAW,CAAC,EACZ,YAAa,GACb,YAAa,IACf,EAOO,SAASC,EAA2BC,EAAgC,CAhF3E,IAAAC,EAiFE,GAAM,CAAE,UAAAC,EAAW,WAAAR,EAAY,OAAAS,EAAQ,QAAAC,CAAQ,EAAIJ,EAC7CK,EAAgBD,EAAU,OAAO,OAAO,CAAC,EAAGN,EAAgBM,CAAO,EAAIN,EACvEQ,EAAO,QAAU,mBAAmB,KAAK,UAAUD,CAAa,CAAC,EACjEE,EAAa,2BAA2BL,KAAaR,KAAcS,IAEnEK,GAAaP,EAAAD,EAAO,aAAP,KAAAC,EAAqB,IAAI,gBAE5C,MAAO,CACL,WAAAO,EACA,QAAS,IAAI,QAAQD,EAAY,CAC/B,KAAAD,EACA,YAAa,cACb,QAAS,CACP,eAAgB,mCAClB,EACA,OAAQ,OACR,OAAQE,EAAW,MACrB,CAAC,CACH,CACF,CAEO,SAASC,GAAqBT,EAAgC,CACnE,GAAM,CAAE,WAAAN,EAAY,SAAAgB,EAAU,OAAAP,CAAO,EAAIH,EACnC,CAAE,QAAAW,CAAQ,EAAIZ,EAA2BC,CAAM,EAErD,OAAOY,EAAgBD,EAAS,CAC9B,SAAU,GAAGD,GAAYhB,KAAcS,GACzC,CAAC,CACH,CC7Ge,SAARU,EACLC,EACAC,EACS,CACT,OAAO,OAAO,UAAU,eAAe,KAAKD,EAAKC,CAAG,CACtD,CCLA,IAAMC,EAAY,wJAEH,SAARC,EAA2BC,EAAgB,CAChD,IAAIC,EAAQD,EAAK,SAAS,EAAE,MAAMF,CAAS,EAC3C,GAAIG,IAAU,KACZ,MAAM,IAAI,UAAU,2BAA2B,EAEjD,MAAO,CAAE,KAAMA,EAAM,GAAI,KAAMA,EAAM,GAAG,MAAM,GAAG,EAAG,KAAMA,EAAM,EAAG,CACrE,CCRA,SAASC,GAAY,CAAC,CACtBA,EAAU,UAAY,OAAO,OAAO,IAAI,EAExC,IAAOC,EAAQD,ECDA,SAARE,EACLC,EACAC,EACK,CACL,GAAI,OAAOD,GAAS,SAClB,GAAI,OAAOC,GAAc,SAAU,CACjC,IAAIC,EAAOD,EAAU,MAAM,GAAG,EAE9B,OAAOF,EAAiBC,EAAME,CAAI,CACpC,SAAW,MAAM,QAAQD,CAAS,EAAG,CACnC,IAAIE,EAAeH,EACnB,QAASI,EAAI,EAAGA,EAAIH,EAAU,OAAQG,IACpCD,EAAUA,EAAQF,EAAUG,IAC1BD,EAAQF,EAAUG,KAAO,IAAKC,EAGlC,OAAOF,CACT,KACE,OAAM,IAAI,UAAU,uCAAuC,MAG7D,OAAM,IAAI,UAAU,kCAAkC,CAE1D,CCxBe,SAARG,EAAsBC,EAAiBC,EAA2B,CACvE,QAAQ,KAAKD,CAAO,CACtB,CCOe,SAARE,EACLC,EACAC,EACM,CACN,GAAI,UAAU,SAAW,EACvB,MAAM,IAAI,MACR,8DACF,EAGF,GAAI,MAAM,QAAQA,CAAK,EACrB,QAASC,KAAQD,EAAO,CACtB,GAAM,CAAE,KAAME,CAAS,EAAIC,EAAUF,CAAI,EAEzC,GAAIC,EACFJ,EAAOC,EAAME,CAAI,MAEjB,OAAM,IAAI,MACR,8GACF,CAEJ,KACK,CACL,IAAIG,EACAC,EAMJ,GAJI,OAAOL,GAAU,aACnBI,EAAUD,EAAUH,CAAK,EAAE,MAGzB,OAAOD,GAAS,SAAU,CAC5B,IAAIO,EAAYP,EAAK,MAAM,GAAG,EAEzBK,IACHA,EAAUE,EAAUA,EAAU,OAAS,GACvCA,EAAYA,EAAU,MAAM,EAAGA,EAAU,OAAS,CAAC,GAGrDD,EAAYE,EAAiB,OAAQD,CAAS,CAChD,SACEF,IACC,OAAOL,GAAS,UAAY,OAAOA,GAAS,YAE7CM,EAAYN,MAEZ,OAAM,IAAI,UACR,6DACF,EAGES,EAAIH,EAAWD,CAAO,EAExBK,EAAK,CAACV,EAAMK,CAAO,EAAE,KAAK,GAAG,EAAI,sBAAsB,EAEvDC,EAAUD,GAAWJ,CAEzB,CACF,CCnEA,eAAeU,EAAwBC,EAAgB,CACrD,GAAI,CACF,IAAIC,EAAW,MAAM,MAAM,qBAAsB,CAC/C,KAAM,KAAK,UAAU,CAAE,OAAAD,CAAO,CAAC,EAC/B,QAAS,CACP,OAAQ,wBACR,eAAgB,mBAChB,mBAAoB,gBACtB,EACA,OAAQ,MACV,CAAC,EAED,GAAIC,EAAS,GACX,OAAQ,MAAMA,EAAS,KAAK,CAEhC,OAASC,EAAP,CAAe,CAEjB,OAAOF,CACT,CAKA,SAASG,EACPH,EACAI,EAC0B,CA1B5B,IAAAC,EA2BE,KAAIA,EAAA,mBAAI,UAAJ,YAAAA,EAAa,QAAS,OAAW,CACnC,GAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,QAAQ,KAAML,CAAM,EAAG,CAClE,GAAG,QAAQ,KAAKA,GAAUA,EAE1B,IAAIM,EAAUP,EAAwBC,CAAM,EAAE,KAAMO,IAClD,GAAG,QAAQ,KAAKP,GAAUO,EACnBA,EACR,EAED,GAAIH,EACF,OAAOE,CAEX,CAEA,OAAO,GAAG,QAAQ,KAAKN,EACzB,KACE,QAAOA,CAEX,CAUA,IAAMQ,EAAM,0BACNC,EAAc,OAAOD,IAAQ,IAAI,IAElC,OAAOA,KACV,OAAOA,GAAOC,GAGhB,SAASC,GAAyB,CAC5B,SAAS,aAAe,YAC1BC,EAAkB,EAClB,SAAS,oBAAoB,mBAAoBD,CAAsB,EAE3E,CAEI,SAAS,aAAe,UAC1BC,EAAkB,EAElB,SAAS,iBAAiB,mBAAoBD,CAAsB,EAGtE,SAASE,GAAc,CACrB,GAAM,CAAE,GAAAC,CAAG,EAAI,OAEf,OAAOA,GAAMA,EAAG,aAAeA,EAAG,YAAY,WAChD,CAEA,SAASF,GAAoB,CAC3B,GAAIC,EAAY,EAAG,CACjB,GAAI,OAAO,OAAO,wBAA2B,WAAY,CACvD,IAAME,EAAe,OAAO,uBAAuB,EAEnD,QAASd,KAAU,OAAO,KAAKc,CAAY,EACzCL,EAAY,IAAIT,CAAM,CAE1B,CAEK,OAAOQ,KACV,OAAOA,GAAOC,GAGX,OAAO,0BACV,OAAO,wBAA0B,SAAUM,EAAgB,CACzD,IAAMC,EAAU,CAAC,EAEjB,QAAShB,KAAUS,EACjB,GAAIT,EAAQ,CACV,IAAMiB,EAAUjB,EAAO,QAAQ,KAAM,KAAK,EAC1C,GAAIe,EAAgB,CAClB,IAAMG,EAAYf,EAAqBH,CAAM,EAAE,WAC7C,KACA,KACF,EACAgB,EAAQ,KAAK,IAAIC,QAAcC,KAAa,CAC9C,MACEF,EAAQ,KACN,MAAMC,8CAAoDjB,EAAO,WAC/D,IACA,KACF,OACF,CAEJ,CAGF,OAAIe,EACK;AAAA;AAAA;AAAA,IAGbC,EAAQ,KAAK;AAAA,GAAQ;AAAA;AAAA;AAAA;AAAA,GAOV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMbA,EAAQ,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,WAIb,EAEJ,CACF,CAEO,SAASG,EAAmBnB,EAAgB,CACjD,IAAMkB,EAAYf,EAAqBH,CAAM,EAC7C,OAAIkB,IAAclB,GAAU,CAACS,EAAY,IAAIT,CAAM,GACjDS,EAAY,IAAIT,CAAM,EAGjBkB,CACT,CCxJA,SAASE,EAAYC,EAAqB,CAA1C,IAAAC,EACE,MAAO,GAACA,EAAA,mBAAI,UAAJ,YAAAA,EAAa,KAAM,GAAI,SAAUD,CAAG,EAAE,KAAK,GAAG,CACxD,CAEA,IAAME,EAAN,KAAmB,CACjB,aAAc,CACZ,MAAO,EACT,CAEA,mBAAmBF,EAAaG,EAAkB,CAChD,OAAOA,EAAS,CAAC,SAAUH,CAAG,EAAE,KAAK,GAAG,EAAID,EAAYC,CAAG,CAC7D,CAEA,IAAIA,EAAaI,EAAuBD,EAAkB,CACxD,IAAME,EAAQ,KAAK,mBAAmBL,EAAKG,CAAM,EAC3CG,EAAQ,aAAa,QAAQD,CAAK,EAExC,OAAOC,IAAU,KAAO,KAAK,MAAMA,CAAK,EAAIF,CAC9C,CAEA,IAAIJ,EAAaM,EAAgBH,EAAkB,CACjD,aAAa,QACX,KAAK,mBAAmBH,EAAKG,CAAM,EACnC,KAAK,UAAUG,CAAK,CACtB,CACF,CAEA,OAAON,EAAaG,EAAkB,CACpC,IAAME,EAAQ,KAAK,mBAAmBL,EAAKG,CAAM,EACjD,OAAI,aAAa,QAAQE,CAAK,IAAM,MAClC,aAAa,WAAWA,CAAK,EACtB,IAEA,EAEX,CAEA,OAAQ,CACN,IAAME,EAAUR,EAAY,EAAE,EAE9B,QAASC,KAAO,aACVA,EAAI,MAAM,EAAGO,EAAQ,MAAM,IAAMA,GACnC,aAAa,WAAWP,CAAG,CAGjC,CACF,EAEOQ,EAAQ,IAAIN,EC3CnB,IAAqBO,EAArB,KAAoC,CAApC,cAME,KAAQ,aAAoEC,EAAK,EACjF,KAAQ,cAAgB,GACxB,KAAQ,OAAS,KAEjB,QAAQC,EAAoB,CAK1B,GAJA,GAAG,YAAc,GAAG,aAAe,CACjC,MAAO,IACT,EAEI,OAAOA,GAAa,WACtB,MAAM,IAAI,UAAU,wEAAwE,EAG9F,IAAMC,EAAO,IAAM,CACjB,KAAK,YAAY,kBAAmBA,CAAI,EACxCD,EAAS,CACX,EAIA,GAFA,KAAK,YAAY,kBAAmBC,CAAI,EAEpC,KAAK,gBAAkB,GAAM,CAC/B,KAAK,cAAgB,GACrB,IAAMC,EAAmB,SAAS,cAAc,KAAK,EACrDA,EAAiB,UAAY,4BAC7BA,EAAiB,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAMHC,EAAmB,UAAU;AAAA;AAAA;AAAA;AAAA,gCAI7BA,EAAmB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAM/CA,EAAmB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanC,IAAMC,EAAU,GAAG,YAAY,MAAQN,EAAe,SAAS,MAAQA,EAAe,SAAS,MAEzFO,EAAcH,EAAiB,cAAc,UAAU,EACvDI,EAAaJ,EAAiB,cAAc,gBAAgB,EAC5DK,EAAWL,EAAiB,cAAc,kBAAkB,EAC5DM,EAAaN,EAAiB,cAAc,UAAU,EACtDO,EAAeP,EAAiB,cAAc,sBAAsB,EAE1E,GACEG,IAAgB,MAChBE,IAAa,MACbD,IAAe,MACfC,IAAa,MACbC,IAAe,MACfC,IAAiB,KACjB,CACAJ,EAAY,UAAYF,EAAmBC,CAAO,EAElDG,EAAS,MAAQ,GAAG,YAAY,OAAS,GACzCA,EAAS,SAAW,CAAC,CAAC,GAAG,YAAY,MACrCA,EAAS,SAAW,CAAC,CAAC,GAAG,YAAY,MAErC,SAAS,KAAK,YAAYL,CAAgB,EAE1C,IAAMQ,EAAU,SAAY,CAC1BD,EAAa,SAAW,GAExB,IAAME,EAAU,IAAI,QAAQ,SAAU,CACpC,KAAM,KAAK,UAAU,CACnB,SAAUJ,EAAS,MACnB,SAAUE,EAAa,MACvB,SAAU,EACZ,CAAC,EACD,QAAS,CACP,OAAQ,mBACR,eAAgB,kCAChB,mBAAoB,gBACtB,EACA,OAAQ,MACV,CAAC,EAED,GAAI,CAEF,IAAMG,EAAO,MADI,MAAM,MAAMD,CAAO,GACR,KAAK,EAEjC,GAAIC,EAAK,QACP,SAAS,KAAK,YAAYV,CAAgB,EAC1C,KAAK,cAAgB,GACrB,KAAK,aAAa,KAAK,iBAAiB,EAEpCI,EAAW,aACZA,EAAW,WAA2B,MAAM,QAAU,YAGzD,OAAM,IAAI,MAAMM,EAAK,KAAK,CAE9B,OAASC,EAAP,CACA,GAAIA,GAAO,OAAOA,GAAQ,SAAU,CAClC,IAAIC,EAAQD,EACZJ,EAAa,SAAW,GACxBA,EAAa,UAAU,OAAO,UAAW,EAAI,EAC7CA,EAAa,MAAQ,GACrBA,EAAa,MAAM,EACnBH,EAAW,UAAYQ,EAAM,QAAUA,EAAM,QAAU,OAAOA,CAAK,EAE/DR,EAAW,aACZA,EAAW,WAA2B,MAAM,QAAU,UAE3D,CACF,CACF,EAEAE,EAAW,iBAAiB,QAASE,CAAO,EAE5CD,EAAa,iBAAiB,QAASM,GAAO,CACxCA,EAAI,MAAQ,SACdL,EAAQ,CAEZ,CAAC,EAEDD,EAAa,iBAAiB,SAAUM,GAAO,CACxCA,EAAsB,MAAQ,SACjCL,EAAQ,CAEZ,CAAC,EAEDH,EAAS,iBAAiB,QAASQ,GAAO,CACpCA,EAAI,MAAQ,SACdL,EAAQ,CAEZ,CAAC,EAEDH,EAAS,iBAAiB,SAAUQ,GAAO,CACpCA,EAAsB,MAAQ,SACjCL,EAAQ,CAEZ,CAAC,EAEDD,EAAa,MAAM,CACrB,CACF,CACF,CAEA,YAAYO,EAAgCC,EAAkB,CAC5D,OAAO,KAAK,aAAa,GAAGD,EAAWC,CAAO,CAChD,CAEA,YAAYD,EAAgCC,EAAkB,CAC5D,OAAO,KAAK,aAAa,IAAID,EAAWC,CAAO,CACjD,CACF,EAzKqBC,EAArBpB,EAAqBoB,EACZ,SAAW,CAChB,MAAO,SACP,MAAO,0BACT,ECPF,IAAqBC,EAArB,cAAyCC,CAAe,CAQtD,YAAYC,EAAe,CACzB,MAAM,EARR,sBAA2B,IAE3B,oBAAgC,KAChC,qBAA0B,aAC1B,WAAuB,KACvB,iBAAuB,GAIrB,KAAK,QAAU,CAAC,EAChB,OAAO,OAAO,KAAMA,CAAQ,CAC9B,CACF,ECbA,SAASC,EAAaC,EAAeC,EAA4E,CAC/G,GAAID,IAAU,GACZ,OAAO,KACF,GAAIC,IAAS,SAAU,CAC5B,IAAIC,EAAW,OAAOF,CAAK,EAE3B,OAAO,MAAME,CAAQ,EAAI,OAAYA,CACvC,SAAW,CAAC,OAAQ,WAAY,MAAM,EAAE,SAASD,CAAI,EAAG,CACtD,IAAIE,EAAY,IAAI,KAAKH,CAAK,EAE9B,OAAO,MAAMG,EAAU,QAAQ,CAAC,EAAI,OAAYA,CAClD,KAAO,IAAIF,IAAS,UAClB,OAAOD,EAAM,YAAY,IAAM,OAC1B,GAAIC,IAAS,SAClB,OAAO,OAAOD,CAAK,EAGrB,OAAOA,CACT,CAQO,SAASI,EAA0BC,EAAuBC,EAAkC,CAAC,EAAe,CA5BnH,IAAAC,EA6BE,IAAIC,EAAW,IAAI,SAASH,CAAI,EAC5BI,EAAc,CAAC,EAEnB,QAASC,KAASF,EAAS,QAAQ,EAAG,CACpC,IAAIG,EAAQD,EAAM,GACdT,GAAOM,EAAAD,GAAA,YAAAA,EAAUK,KAAV,KAAAJ,EAAoB,SAC3BP,EAAQD,EAAaW,EAAM,GAAcT,CAAI,EAE7CQ,EAAO,eAAeE,CAAK,EACzB,MAAM,QAAQF,EAAOE,EAAM,EAC7BF,EAAOE,GAAO,KAAKX,CAAK,EAExBS,EAAOE,GAAS,CAACF,EAAOE,GAAQX,CAAK,EAGvCS,EAAOE,GAASX,CAEpB,CAEA,OAAOS,CACT,CAUO,SAASG,EAA8BP,EAAuBQ,EAAuC,CAC1G,IAAIC,EAASD,EAAW,UAAU,EAC9BE,EAAQ,OAAO,YAAYD,EAAO,IAAKH,GAAU,CAACA,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EAE9E,OAAOP,EAAoBC,EAAMU,CAAK,CACxC,CAUO,SAASC,EAAiCX,EAAuBY,EAAiC,CACvG,IAAIC,EAAaD,EAAU,cAAc,EACrCF,EAAQ,OAAO,YAAYG,EAAW,IAAKC,GAAU,CAACA,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EAElF,OAAOf,EAAiBC,EAAMU,CAAK,CACrC,CC/EA,SAASK,EAAOC,EAAkB,CAEhC,MAAO,GADYA,GAAW,GAAG,QAAQ,MACjB,GAAG,YAAY,OACzC,CAEO,SAASC,GAAeC,EAAiBF,EAA4B,CAC1E,GAAI,EAAC,aAAI,aAAa,OAAO,KAE7B,IAAMG,EAAMJ,EAAOC,CAAO,EACpBI,EAAW,KAAK,MAAM,aAAa,QAAQD,CAAG,GAAK,IAAI,EAE7D,OAAID,EACKE,EAASF,IAAY,KAGvBE,CACT,CAEO,SAASC,GACdH,EACAI,EACAN,EACM,CACN,GAAI,EAAC,aAAI,aAAa,OAEtB,IAAMG,EAAMJ,EAAOC,CAAO,EACtBO,EAAe,KAAK,MAAM,aAAa,QAAQJ,CAAG,GAAK,IAAI,EAE3D,OAAOG,GAAU,YACnBC,EAAaL,GAAWI,EAExBC,EAAeL,EAGjB,aAAa,QAAQC,EAAK,KAAK,UAAUI,CAAY,CAAC,CACxD,CCxBO,IAAMC,GAAU",
6
- "names": ["all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "downloadBlob", "blob", "fileName", "resolve", "reject", "url", "parent", "anchor", "ex", "downloadRequest", "request", "fileName", "controller", "onProgress", "_a", "_b", "reportProgress", "progress", "__spreadValues", "bytesReceived", "response", "data", "reader", "stream", "pump", "read", "error", "blob", "downloadBlob", "err", "exportOptionsFromDataObject", "dataObject", "specifiedOptions", "__spreadValues", "field", "defaultOptions", "getDataObjectReportRequest", "params", "_a", "articleId", "format", "options", "reportOptions", "body", "requestUrl", "controller", "openDataObjectReport", "fileName", "request", "downloadRequest", "has", "obj", "key", "funcRegex", "parseFunc", "func", "match", "Namespace", "Namespace_default", "requireNamespace", "root", "namespace", "path", "current", "i", "Namespace_default", "warn", "message", "fallbackToAlert", "expose", "name", "value", "func", "funcName", "parseFunc", "keyName", "namespace", "pathParts", "requireNamespace", "has", "warn", "getLocalizedStringAsync", "string", "response", "error", "afGetLocalizedString", "wait", "_a", "promise", "text", "key", "localizeSet", "handleReadyStateChange", "addDeveloperUtils", "isDeveloper", "af", "addedStrings", "forCustomRoute", "strings", "escaped", "localized", "getLocalizedString", "getLocalKey", "key", "_a", "LocalStorage", "global", "defaultValue", "lsKey", "value", "baseKey", "localStorage_default", "_SessionHandler", "mitt_default", "callback", "once", "contentContainer", "getLocalizedString", "message", "messageElem", "statusElem", "userElem", "signInElem", "passwordElem", "doLogin", "request", "json", "err", "error", "evt", "eventName", "handler", "SessionHandler", "UserSession", "SessionHandler", "userData", "getFormValue", "value", "type", "numValue", "dateValue", "formDataToObject", "form", "typeMap", "_a", "formData", "result", "entry", "field", "formDataToDataObjectRecord", "dataObject", "fields", "types", "formDataToProcedureParameters", "procedure", "parameters", "param", "getKey", "article", "getSettings", "setting", "key", "settings", "saveSettings", "value", "userSettings", "version"]
3
+ "sources": ["../../src/errorHandler.ts", "../../../../node_modules/mitt/src/index.ts", "../../src/downloadBlob.ts", "../../src/downloadRequest.ts", "../../src/exportDataObject.ts", "../../src/has.ts", "../../src/parseFunc.ts", "../../src/Namespace.ts", "../../src/requireNamespace.ts", "../../src/warn.ts", "../../src/expose.ts", "../../src/getLocalizedString.ts", "../../src/localStorage.ts", "../../src/SessionHandler.ts", "../../src/UserSession.ts", "../../src/formDataToObject.ts", "../../src/settings.ts", "../../src/index.ts"],
4
+ "sourcesContent": ["window.addEventListener(\"error\", (event) => {\n try {\n // Try to avoid error-logging-loop\n const data = {\n error: event.message ?? null,\n file: event.filename,\n line: event.lineno ?? 0,\n column: event.colno ?? 0,\n stack: null,\n };\n\n fetch(\"/data/Logger/LogError\", {\n body: JSON.stringify(data),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n method: \"POST\",\n });\n } catch (ex) {\n // ignore\n }\n});\n", "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", "export function downloadBlob(blob: Blob | MediaSource, fileName: string) {\n return new Promise<void>(function (resolve, reject) {\n try {\n const url = URL.createObjectURL(blob);\n const parent = document.body;\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"download\", fileName);\n anchor.href = url;\n parent.append(anchor);\n anchor.click();\n parent.removeChild(anchor);\n\n setTimeout(function () {\n URL.revokeObjectURL(url);\n resolve();\n }, 250);\n } catch (ex) {\n reject(ex);\n }\n });\n}\n", "import { downloadBlob } from \"./downloadBlob.js\";\n\nexport type DownloadItem = {\n status: \"cancelled\" | \"error\" | \"requested\" | \"downloading\" | \"downloaded\" | \"completed\";\n bytesReceived?: number;\n error?: string;\n};\n\nexport type DownloadParameters = {\n controller?: AbortController;\n fileName: string;\n onProgress?: (progress: DownloadItem) => void;\n};\n\nexport async function downloadRequest(request: Request, { fileName, controller, onProgress }: DownloadParameters) {\n function reportProgress(progress: DownloadItem) {\n if (typeof onProgress === \"function\") {\n onProgress({ ...progress });\n }\n }\n\n let bytesReceived = 0;\n\n reportProgress({ status: \"requested\" });\n\n try {\n let response = await fetch(request);\n\n if (!response.ok || !response.body) {\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n let data = await response.json();\n if (data.error) {\n throw new Error(data.error);\n }\n }\n throw new Error(response.status + \" \" + response.statusText);\n }\n\n try {\n const reader = response.body.getReader();\n const stream = new ReadableStream({\n start: function (controller) {\n function pump(): Promise<void> {\n return reader.read().then(function (read) {\n if (read.done) {\n controller.close();\n return;\n }\n\n bytesReceived += read.value.length;\n reportProgress({ bytesReceived, status: \"downloading\" });\n controller.enqueue(read.value);\n\n return pump();\n });\n }\n\n return pump();\n },\n });\n\n response = new Response(stream);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to replace response stream to log download progress.\");\n }\n\n const blob = await response.blob();\n\n reportProgress({ bytesReceived, status: \"downloaded\" });\n\n await downloadBlob(blob, fileName);\n\n reportProgress({ bytesReceived, status: \"completed\" });\n } catch (err) {\n if (controller?.signal?.aborted) {\n reportProgress({ status: \"cancelled\" });\n } else {\n reportProgress({ error: (err as Error).message, status: \"error\" });\n }\n }\n}\n", "import { DataObject, DataObjectOptions } from \"@olenbetong/appframe-data\";\nimport { RetrieveParameters } from \"@olenbetong/appframe-data\";\n\nimport { downloadRequest } from \"./downloadRequest.js\";\n\nexport type DataExportColumn = {\n name: string;\n caption?: string;\n cellFormat?: string;\n format?: string;\n};\n\nexport type DataExportOptions = RetrieveParameters<any> & { columns: DataExportColumn[] };\nexport type DataObjectReportParams = {\n articleId: string;\n controller?: AbortController;\n dataObject: string;\n format: \"pdf\" | \"xlsx\" | \"csv\" | \"xls\";\n fileName?: string;\n options: DataExportOptions;\n id?: string;\n title?: string;\n subTitle?: string;\n /**\n * Whether the title should be shown in the exported file (default true)\n */\n includeTitle?: boolean;\n /**\n * Whether the filter should be shown in the exported file (default true)\n */\n includefilter?: boolean;\n /**\n * Whether we should try to convert from camelCase to human readable names (default true)\n */\n formatHeaders?: boolean;\n /**\n * Whether the header should be frozen on top of the excel file.\n */\n freezeHeader?: boolean;\n};\n\n/**\n * Get columns and retrieve parameters from a data object to be used to create a report.\n * @param dataObject Data object to get parameters and columns from\n * @param specifiedOptions Options to override the data object options\n * @returns\n */\nexport function exportOptionsFromDataObject(\n dataObject: DataObject<any>,\n specifiedOptions: Partial<DataObjectOptions<any>>\n) {\n return {\n columns: dataObject.getFields().map((field) => ({ name: field.name })),\n distinctRows: dataObject.getParameter(\"distinctRows\"),\n filterObject: dataObject.getParameter(\"filterObject\"),\n filterString: dataObject.getParameter(\"filterString\"),\n maxRecords: dataObject.getParameter(\"maxRecords\"),\n sortOrder: dataObject.getParameter(\"sortOrder\"),\n whereClause: dataObject.getParameter(\"whereClause\"),\n whereObject: dataObject.getParameter(\"whereObject\"),\n ...specifiedOptions,\n };\n}\n\nconst defaultOptions: DataExportOptions = {\n columns: [],\n distinctRows: false,\n filterObject: null,\n filterString: \"\",\n maxRecords: -1,\n sortOrder: [],\n whereClause: \"\",\n whereObject: null,\n};\n\n/**\n * Get a request object to download a report from a data object.\n * @param params Parameters to use to create a report\n * @returns Request object for the report\n */\nexport function getDataObjectReportRequest(params: DataObjectReportParams) {\n const { articleId, dataObject, format, options } = params;\n const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;\n const body = \"data=\" + encodeURIComponent(JSON.stringify(reportOptions));\n const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;\n\n const controller = params.controller ?? new AbortController();\n\n return {\n controller,\n request: new Request(requestUrl, {\n body,\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n signal: controller.signal,\n }),\n };\n}\n\nexport function openDataObjectReport(params: DataObjectReportParams) {\n const { dataObject, fileName, format } = params;\n const { request } = getDataObjectReportRequest(params);\n\n return downloadRequest(request, {\n fileName: `${fileName || dataObject}.${format}`,\n });\n}\n", "export default function has(\n obj: any,\n key: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "const funcRegex = /^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 default function parseFunc(func: Function) {\n var match = func.toString().match(funcRegex);\n if (match === null) {\n throw new TypeError(\"Unable to parse function!\");\n }\n return { 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 default function requireNamespace(\n root: any,\n namespace: string | Array<string>\n): any {\n if (typeof root === \"object\") {\n if (typeof namespace === \"string\") {\n let path = namespace.split(\".\");\n\n return requireNamespace(root, path);\n } else if (Array.isArray(namespace)) {\n let current: any = root;\n for (let i = 0; i < namespace.length; i++) {\n current = current[namespace[i]] =\n current[namespace[i]] || new (Namespace as any)();\n }\n\n return current;\n } else {\n throw new TypeError(\"Invalid type of parameter 'namespace'\");\n }\n } else {\n throw new TypeError(\"Invalid type of parameter 'root'\");\n }\n}\n", "/* eslint-disable no-console */\nexport default function warn(message: string, fallbackToAlert?: boolean) {\n console.warn(message);\n}\n", "import has from \"./has.js\";\nimport parseFunc from \"./parseFunc.js\";\nimport requireNamespace from \"./requireNamespace.js\";\nimport warn from \"./warn.js\";\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 default function expose(\n name: object | string,\n value: object | Function | Function[]\n): void {\n if (arguments.length !== 2) {\n throw new Error(\n \"Incorrect number of arguments passed to the expose function!\"\n );\n }\n\n if (Array.isArray(value)) {\n for (let func of value) {\n const { name: funcName } = parseFunc(func);\n\n if (funcName) {\n expose(name, func); // Expose func on namespace found in pName\n } else {\n throw new Error(\n \"Unable to detect name of function! Name it, or only supply one function and include name in first parameter.\"\n );\n }\n }\n } else {\n let keyName: string | undefined;\n let namespace;\n\n if (typeof value === \"function\") {\n keyName = parseFunc(value).name;\n }\n\n if (typeof name === \"string\") {\n let pathParts = name.split(\".\");\n\n if (!keyName) {\n keyName = pathParts[pathParts.length - 1];\n pathParts = pathParts.slice(0, pathParts.length - 1);\n }\n\n namespace = requireNamespace(window, pathParts);\n } else if (\n keyName &&\n (typeof name === \"object\" || typeof name === \"function\")\n ) {\n namespace = name;\n } else {\n throw new TypeError(\n \"Invalid typeof parameter 'name', or unable to parse pValue!\"\n );\n }\n\n if (has(namespace, keyName)) {\n // If class is already defined, warn or show an alert\n warn([name, keyName].join(\".\") + \" is already defined!\");\n } else {\n namespace[keyName] = value;\n }\n }\n}\n", "async function getLocalizedStringAsync(string: string) {\n try {\n let response = await fetch(\"/api/user/localize\", {\n body: JSON.stringify({ string }),\n headers: {\n Accept: \"application/json; */*\",\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n method: \"POST\",\n });\n\n if (response.ok) {\n return (await response.json()) as string;\n }\n } catch (error) {}\n\n return string;\n}\n\nfunction afGetLocalizedString(string: string): string;\nfunction afGetLocalizedString(string: string, wait: false): string;\nfunction afGetLocalizedString(string: string, wait: true): Promise<string>;\nfunction afGetLocalizedString(\n string: string,\n wait?: boolean\n): string | Promise<string> {\n if (af?.article?.i18n !== undefined) {\n if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {\n af.article.i18n[string] = string;\n\n let promise = getLocalizedStringAsync(string).then((text) => {\n af.article.i18n[string] = text;\n return text;\n });\n\n if (wait) {\n return promise;\n }\n }\n\n return af.article.i18n[string];\n } else {\n return string;\n }\n}\n\ndeclare global {\n interface Window {\n __UNLOCALIZED_STRINGS__: Set<string>;\n __doNothingWithStrings?: () => Record<string, string>;\n __getUnlocalizedStrings?: (forCustomRoute?: boolean) => string;\n }\n}\n\nconst key = \"__UNLOCALIZED_STRINGS__\";\nconst localizeSet = window[key] || new Set();\n\nif (!window[key]) {\n window[key] = localizeSet;\n}\n\nfunction handleReadyStateChange() {\n if (document.readyState !== \"loading\") {\n addDeveloperUtils();\n document.removeEventListener(\"readystatechange\", handleReadyStateChange);\n }\n}\n\nif (document.readyState !== \"loading\") {\n addDeveloperUtils();\n} else {\n document.addEventListener(\"readystatechange\", handleReadyStateChange);\n}\n\nfunction isDeveloper() {\n const { af } = window;\n\n return af && af.userSession && af.userSession.isDeveloper;\n}\n\nfunction addDeveloperUtils() {\n if (isDeveloper()) {\n if (typeof window.__doNothingWithStrings === \"function\") {\n const addedStrings = window.__doNothingWithStrings();\n\n for (let string of Object.keys(addedStrings)) {\n localizeSet.add(string);\n }\n }\n\n if (!window[key]) {\n window[key] = localizeSet;\n }\n\n if (!window.__getUnlocalizedStrings) {\n window.__getUnlocalizedStrings = function (forCustomRoute) {\n const strings = [];\n\n for (let string of localizeSet) {\n if (string) {\n const escaped = string.replace(/'/g, \"\\\\'\");\n if (forCustomRoute) {\n const localized = afGetLocalizedString(string).replaceAll(\n /'/g,\n \"\\\\'\"\n );\n strings.push(`'${escaped}': '${localized}',`);\n } else {\n strings.push(\n `s['${escaped}'] = @Html(@context.AddLocalizableString(\"${string.replaceAll(\n '\"',\n '\\\\\"'\n )}\"));`\n );\n }\n }\n }\n\n if (forCustomRoute) {\n return `// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used\nif (af.userSession.uiculture === 'nb-NO') {\n\tconst strings = {\n\t\t${strings.join(\"\\n\\t\\t\")}\n\t};\n\taf.article.i18n = af.article.i18n || {};\n\tObject.assign(af.article.i18n, strings);\n}`;\n }\n\n return `<script type=\"text/javascript\">\nfunction __doNothingWithStrings() {\n@{\n\tvar context = @Appframe.Web.Context.RequestContext.Current;\n}\nlet s = {};\n${strings.join(\"\\n\")}\nreturn s;\n}\n</script>`;\n };\n }\n }\n}\n\nexport function getLocalizedString(string: string) {\n const localized = afGetLocalizedString(string);\n if (localized === string && !localizeSet.has(string)) {\n localizeSet.add(string);\n }\n\n return localized;\n}\n", "function getLocalKey(key: string): string {\n return [af?.article?.id || \"\", \"common\", key].join(\".\");\n}\n\nclass LocalStorage {\n isPersisted() {\n return true;\n }\n\n getLocalStorageKey(key: string, global?: boolean) {\n return global ? [\"common\", key].join(\".\") : getLocalKey(key);\n }\n\n get(key: string, defaultValue: unknown, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n const value = localStorage.getItem(lsKey);\n\n return value !== null ? JSON.parse(value) : defaultValue;\n }\n\n set(key: string, value: unknown, global?: boolean) {\n localStorage.setItem(\n this.getLocalStorageKey(key, global),\n JSON.stringify(value)\n );\n }\n\n remove(key: string, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n if (localStorage.getItem(lsKey) !== null) {\n localStorage.removeItem(lsKey);\n return true;\n } else {\n return false;\n }\n }\n\n clear() {\n const baseKey = getLocalKey(\"\");\n\n for (let key in localStorage) {\n if (key.slice(0, baseKey.length) === baseKey) {\n localStorage.removeItem(key);\n }\n }\n }\n}\n\nexport default new LocalStorage();\n", "import mitt, { Emitter, Handler } from \"mitt\";\nimport { getLocalizedString } from \"./getLocalizedString.js\";\n\ntype SessionHandlerEvent = \"onExpired\" | \"onAuthenticated\";\n\nexport default class SessionHandler {\n static messages = {\n login: \"Log in\",\n relog: \"Session expired - log in\"\n };\n\n private eventHandler: Emitter<{ onAuthenticated: void; onExpired: void }> = mitt();\n private showingDialog = false;\n private dialog = null;\n\n expired(callback: Function) {\n af.userSession = af.userSession || {\n login: null\n };\n\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Parameter pCallback passed to the expired function must be a function!\");\n }\n\n const once = () => {\n this.detachEvent(\"onAuthenticated\", once);\n callback();\n };\n\n this.attachEvent(\"onAuthenticated\", once);\n\n if (this.showingDialog !== true) {\n this.showingDialog = true;\n const contentContainer = document.createElement(\"div\");\n contentContainer.className = \"session-expired-container\";\n contentContainer.innerHTML = `\n<div class=\"session-expired-log-in\" style=\"margin-top: 20px;\">\n <div class=\"row\">\n <div class=\"sessionExpired\">\n <h4 class=\"message\">Frakoblet - tidsavbrudd</h4>\n <div class=\"form-group\">\n <label for=\"username\">${getLocalizedString(\"Username\")}</label>\n <input type=\"text\" class=\"form-control\" id=\"username\" autofocus>\n </div>\n <div class=\"form-group\">\n <label for=\"password\">${getLocalizedString(\"Password\")}</label>\n <input type=\"password\" autocomplete=\"password\" class=\"form-control\" id=\"password\" >\n </div>\n <div class=\"form-group\">\n <div>\n <button type=\"submit\" class=\"btn btn-default sign-in\">\n ${getLocalizedString(\"Log in\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"\" style=\"display:none; margin: 0px 30px;\">\n <div class=\"alert alert-warning\" role=\"alert\" style=\"margin-top:10px;\"></div> \n </div>\n </div>\n</div>\n`;\n const message = af.userSession.login ? SessionHandler.messages.relog : SessionHandler.messages.login;\n\n const messageElem = contentContainer.querySelector(\".message\") as HTMLHeadingElement;\n const statusElem = contentContainer.querySelector(\".alert-warning\") as HTMLDivElement;\n const userElem = contentContainer.querySelector(\"input[type=text]\") as HTMLInputElement;\n const signInElem = contentContainer.querySelector(\".sign-in\") as HTMLButtonElement;\n const passwordElem = contentContainer.querySelector(\"input[type=password]\") as HTMLInputElement;\n\n if (\n messageElem !== null &&\n userElem !== null &&\n statusElem !== null &&\n userElem !== null &&\n signInElem !== null &&\n passwordElem !== null\n ) {\n messageElem.innerText = getLocalizedString(message);\n\n userElem.value = af.userSession.login || \"\";\n userElem.disabled = !!af.userSession.login;\n userElem.readOnly = !!af.userSession.login;\n\n document.body.appendChild(contentContainer);\n\n const doLogin = async () => {\n passwordElem.disabled = true;\n\n const request = new Request(\"/login\", {\n body: JSON.stringify({\n username: userElem.value,\n password: passwordElem.value,\n remember: false\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n method: \"POST\"\n });\n\n try {\n const response = await fetch(request);\n const json = await response.json();\n\n if (json.success) {\n document.body.removeChild(contentContainer);\n this.showingDialog = false;\n this.eventHandler.emit(\"onAuthenticated\");\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"none\";\n }\n } else {\n throw new Error(json.error);\n }\n } catch (err) {\n if (err && typeof err === \"object\") {\n let error = err as Error;\n passwordElem.disabled = false;\n passwordElem.classList.toggle(\"invalid\", true);\n passwordElem.value = \"\";\n passwordElem.focus();\n statusElem.innerText = error.message ? error.message : String(error);\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"initial\";\n }\n }\n }\n };\n\n signInElem.addEventListener(\"click\", doLogin);\n\n passwordElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.focus();\n }\n }\n }\n\n attachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.on(eventName, handler);\n }\n\n detachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.off(eventName, handler);\n }\n}\n", "import SessionHandler from \"./SessionHandler.js\";\n\nexport default class UserSession extends SessionHandler {\n decimalSeparator: string = \".\";\n formats: any;\n groupSeparator: string | null = null;\n shortDateFormat: string = \"dd.MM.yyyy\";\n login: string | null = null;\n isDeveloper: boolean = false;\n\n constructor(userData: any) {\n super();\n this.formats = {};\n Object.assign(this, userData);\n }\n}\n", "import type { DataObject, Procedure } from \"@olenbetong/appframe-data\";\n\nfunction getFormValue(value: string, type: string): string | number | boolean | Date | BigInt | null | undefined {\n if (value === \"\") {\n return null;\n } else if (type === \"number\") {\n let numValue = Number(value);\n\n return isNaN(numValue) ? undefined : numValue;\n } else if ([\"date\", \"datetime\", \"time\"].includes(type)) {\n let dateValue = new Date(value);\n\n return isNaN(dateValue.getTime()) ? undefined : dateValue;\n } else if (type === \"boolean\") {\n return value.toLowerCase() === \"true\";\n } else if (type === \"bigint\") {\n return BigInt(value);\n }\n\n return value;\n}\n\n/**\n * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.\n * @param form HTML form element to get form data from.\n * @param typeMap A mapping from field name to field type\n * @returns\n */\nexport function formDataToObject<T = any>(form: HTMLFormElement, typeMap: Record<string, string> = {}): Partial<T> {\n let formData = new FormData(form);\n let result: any = {};\n\n for (let entry of formData.entries()) {\n let field = entry[0];\n let type = typeMap?.[field] ?? \"string\";\n let value = getFormValue(entry[1] as string, type);\n\n if (result.hasOwnProperty(field)) {\n if (Array.isArray(result[field])) {\n result[field].push(value);\n } else {\n result[field] = [result[field], value];\n }\n } else {\n result[field] = value;\n }\n }\n\n return result as T;\n}\n\n/**\n * Creates a partial data object record from form data. The name property is mapped\n * to field name.\n *\n * @param form HTML form element to get FormData from\n * @param dataObject Data object for which to create a record from the form data\n * @returns {Partial<T>} Partial data object record\n */\nexport function formDataToDataObjectRecord<T>(form: HTMLFormElement, dataObject: DataObject<T>): Partial<T> {\n let fields = dataObject.getFields();\n let types = Object.fromEntries(fields.map((field) => [field.name, field.type])) as Record<string, string>;\n\n return formDataToObject<T>(form, types);\n}\n\n/**\n * Creates procedure parameters from form data. The name property is mapped\n * to parameter names.\n *\n * @param form HTML Form element to get FormData from\n * @param procedure Appframe Procedure to create parameters for\n * @returns\n */\nexport function formDataToProcedureParameters<T>(form: HTMLFormElement, procedure: Procedure<T, any>): T {\n let parameters = procedure.getParameters();\n let types = Object.fromEntries(parameters.map((param) => [param.name, param.type])) as Record<string, string>;\n\n return formDataToObject(form, types) as T;\n}\n", "function getKey(article?: string) {\n const articleKey = article || af.article.id;\n return `${articleKey}.${af.userSession.login}`;\n}\n\nexport function getSettings<T>(setting: string, article?: string): T | null {\n if (!af?.userSession) return null;\n\n const key = getKey(article);\n const settings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (setting) {\n return settings[setting] || null;\n }\n\n return settings;\n}\n\nexport function saveSettings<T>(\n setting: string,\n value: T | null,\n article?: string\n): void {\n if (!af?.userSession) return;\n\n const key = getKey(article);\n let userSettings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (typeof value !== \"undefined\") {\n userSettings[setting] = value;\n } else {\n userSettings = setting;\n }\n\n localStorage.setItem(key, JSON.stringify(userSettings));\n}\n", "import \"./errorHandler.js\";\n\nexport { default as mitt } from \"mitt\";\nexport { downloadBlob } from \"./downloadBlob.js\";\nexport * from \"./downloadRequest.js\";\nexport * from \"./exportDataObject.js\";\nexport { default as expose } from \"./expose.js\";\nexport { getLocalizedString } from \"./getLocalizedString.js\";\nexport * from \"./has.js\";\nexport { default as localStorage } from \"./localStorage.js\";\nexport { default as SessionHandler } from \"./SessionHandler.js\";\nexport { default as UserSession } from \"./UserSession.js\";\nexport { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from \"./formDataToObject.js\";\nexport * from \"./settings.js\";\n\nexport const version = __VERSION__;\n"],
5
+ "mappings": "AAAA,OAAO,iBAAiB,QAAUA,GAAU,CAC1C,GAAI,CAEF,IAAMC,EAAO,CACX,MAAOD,EAAM,SAAW,KACxB,KAAMA,EAAM,SACZ,KAAMA,EAAM,QAAU,EACtB,OAAQA,EAAM,OAAS,EACvB,MAAO,IACT,EAEA,MAAM,wBAAyB,CAC7B,KAAM,KAAK,UAAUC,CAAI,EACzB,QAAS,CACP,OAAQ,mBACR,eAAgB,kCAChB,mBAAoB,gBACtB,EACA,OAAQ,MACV,CAAC,CACH,MAAE,CAEF,CACF,CAAC,aCgBAC,EAAAA,CAOA,MAAO,CAKNA,IAPDA,EAAMA,GAAO,IAAIC,IAehBC,GAAAA,SAA6BC,EAAWC,EAAAA,CACvC,IAAMC,EAAmDL,EAAKM,IAAIH,CAAAA,EAC9DE,EACHA,EAASE,KAAKH,CAAAA,EAGdJ,EAAKQ,IAAIL,EAAM,CAACC,CAAAA,CAAAA,CAAAA,EAWlBK,IAAAA,SAA8BN,EAAWC,EAAAA,CACxC,IAAMC,EAAmDL,EAAKM,IAAIH,CAAAA,EAC9DE,IACCD,EACHC,EAASK,OAAOL,EAASM,QAAQP,CAAAA,IAAa,EAAG,CAAA,EAGjDJ,EAAKQ,IAAIL,EAAM,CAAA,CAAA,EAAA,EAelBS,KAAAA,SAA+BT,EAAWU,EAAAA,CACzC,IAAIR,EAAWL,EAAKM,IAAIH,CAAAA,EACpBE,GACFA,EACCS,MAAAA,EACAC,IAAI,SAACX,EAAAA,CACLA,EAAQS,CAAAA,CAAAA,CAAAA,GAIXR,EAAWL,EAAKM,IAAI,GAAA,IAElBD,EACCS,MAAAA,EACAC,IAAI,SAACX,EAAAA,CACLA,EAAQD,EAAMU,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CAAAA,CCjHb,SAASG,EAAaC,EAA0BC,EAAkB,CACvE,OAAO,IAAI,QAAc,SAAUC,EAASC,EAAQ,CAClD,GAAI,CACF,IAAMC,EAAM,IAAI,gBAAgBJ,CAAI,EAC9BK,EAAS,SAAS,KAClBC,EAAS,SAAS,cAAc,GAAG,EACzCA,EAAO,aAAa,WAAYL,CAAQ,EACxCK,EAAO,KAAOF,EACdC,EAAO,OAAOC,CAAM,EACpBA,EAAO,MAAM,EACbD,EAAO,YAAYC,CAAM,EAEzB,WAAW,UAAY,CACrB,IAAI,gBAAgBF,CAAG,EACvBF,EAAQ,CACV,EAAG,GAAG,CACR,OAASK,EAAP,CACAJ,EAAOI,CAAE,CACX,CACF,CAAC,CACH,CCNA,eAAsBC,EAAgBC,EAAkB,CAAE,SAAAC,EAAU,WAAAC,EAAY,WAAAC,CAAW,EAAuB,CAChH,SAASC,EAAeC,EAAwB,CAC1C,OAAOF,GAAe,YACxBA,EAAW,CAAE,GAAGE,CAAS,CAAC,CAE9B,CAEA,IAAIC,EAAgB,EAEpBF,EAAe,CAAE,OAAQ,WAAY,CAAC,EAEtC,GAAI,CACF,IAAIG,EAAW,MAAM,MAAMP,CAAO,EAElC,GAAI,CAACO,EAAS,IAAM,CAACA,EAAS,KAAM,CAClC,GAAIA,EAAS,QAAQ,IAAI,cAAc,GAAG,SAAS,kBAAkB,EAAG,CACtE,IAAIC,EAAO,MAAMD,EAAS,KAAK,EAC/B,GAAIC,EAAK,MACP,MAAM,IAAI,MAAMA,EAAK,KAAK,CAE9B,CACA,MAAM,IAAI,MAAMD,EAAS,OAAS,IAAMA,EAAS,UAAU,CAC7D,CAEA,GAAI,CACF,IAAME,EAASF,EAAS,KAAK,UAAU,EACjCG,EAAS,IAAI,eAAe,CAChC,MAAO,SAAUR,EAAY,CAC3B,SAASS,GAAsB,CAC7B,OAAOF,EAAO,KAAK,EAAE,KAAK,SAAUG,EAAM,CACxC,GAAIA,EAAK,KAAM,CACbV,EAAW,MAAM,EACjB,MACF,CAEA,OAAAI,GAAiBM,EAAK,MAAM,OAC5BR,EAAe,CAAE,cAAAE,EAAe,OAAQ,aAAc,CAAC,EACvDJ,EAAW,QAAQU,EAAK,KAAK,EAEtBD,EAAK,CACd,CAAC,CACH,CAEA,OAAOA,EAAK,CACd,CACF,CAAC,EAEDJ,EAAW,IAAI,SAASG,CAAM,CAChC,MAAE,CAEA,QAAQ,KAAK,6DAA6D,CAC5E,CAEA,IAAMG,EAAO,MAAMN,EAAS,KAAK,EAEjCH,EAAe,CAAE,cAAAE,EAAe,OAAQ,YAAa,CAAC,EAEtD,MAAMQ,EAAaD,EAAMZ,CAAQ,EAEjCG,EAAe,CAAE,cAAAE,EAAe,OAAQ,WAAY,CAAC,CACvD,OAASS,EAAP,CACIb,GAAY,QAAQ,QACtBE,EAAe,CAAE,OAAQ,WAAY,CAAC,EAEtCA,EAAe,CAAE,MAAQW,EAAc,QAAS,OAAQ,OAAQ,CAAC,CAErE,CACF,CClCO,SAASC,EACdC,EACAC,EACA,CACA,MAAO,CACL,QAASD,EAAW,UAAU,EAAE,IAAKE,IAAW,CAAE,KAAMA,EAAM,IAAK,EAAE,EACrE,aAAcF,EAAW,aAAa,cAAc,EACpD,aAAcA,EAAW,aAAa,cAAc,EACpD,aAAcA,EAAW,aAAa,cAAc,EACpD,WAAYA,EAAW,aAAa,YAAY,EAChD,UAAWA,EAAW,aAAa,WAAW,EAC9C,YAAaA,EAAW,aAAa,aAAa,EAClD,YAAaA,EAAW,aAAa,aAAa,EAClD,GAAGC,CACL,CACF,CAEA,IAAME,EAAoC,CACxC,QAAS,CAAC,EACV,aAAc,GACd,aAAc,KACd,aAAc,GACd,WAAY,GACZ,UAAW,CAAC,EACZ,YAAa,GACb,YAAa,IACf,EAOO,SAASC,EAA2BC,EAAgC,CACzE,GAAM,CAAE,UAAAC,EAAW,WAAAN,EAAY,OAAAO,EAAQ,QAAAC,CAAQ,EAAIH,EAC7CI,EAAgBD,EAAU,OAAO,OAAO,CAAC,EAAGL,EAAgBK,CAAO,EAAIL,EACvEO,EAAO,QAAU,mBAAmB,KAAK,UAAUD,CAAa,CAAC,EACjEE,EAAa,2BAA2BL,KAAaN,KAAcO,IAEnEK,EAAaP,EAAO,YAAc,IAAI,gBAE5C,MAAO,CACL,WAAAO,EACA,QAAS,IAAI,QAAQD,EAAY,CAC/B,KAAAD,EACA,YAAa,cACb,QAAS,CACP,eAAgB,mCAClB,EACA,OAAQ,OACR,OAAQE,EAAW,MACrB,CAAC,CACH,CACF,CAEO,SAASC,EAAqBR,EAAgC,CACnE,GAAM,CAAE,WAAAL,EAAY,SAAAc,EAAU,OAAAP,CAAO,EAAIF,EACnC,CAAE,QAAAU,CAAQ,EAAIX,EAA2BC,CAAM,EAErD,OAAOW,EAAgBD,EAAS,CAC9B,SAAU,GAAGD,GAAYd,KAAcO,GACzC,CAAC,CACH,CC7Ge,SAARU,EACLC,EACAC,EACS,CACT,OAAO,OAAO,UAAU,eAAe,KAAKD,EAAKC,CAAG,CACtD,CCLA,IAAMC,EAAY,wJAEH,SAARC,EAA2BC,EAAgB,CAChD,IAAIC,EAAQD,EAAK,SAAS,EAAE,MAAMF,CAAS,EAC3C,GAAIG,IAAU,KACZ,MAAM,IAAI,UAAU,2BAA2B,EAEjD,MAAO,CAAE,KAAMA,EAAM,GAAI,KAAMA,EAAM,GAAG,MAAM,GAAG,EAAG,KAAMA,EAAM,EAAG,CACrE,CCRA,SAASC,GAAY,CAAC,CACtBA,EAAU,UAAY,OAAO,OAAO,IAAI,EAExC,IAAOC,EAAQD,ECDA,SAARE,EACLC,EACAC,EACK,CACL,GAAI,OAAOD,GAAS,SAClB,GAAI,OAAOC,GAAc,SAAU,CACjC,IAAIC,EAAOD,EAAU,MAAM,GAAG,EAE9B,OAAOF,EAAiBC,EAAME,CAAI,CACpC,SAAW,MAAM,QAAQD,CAAS,EAAG,CACnC,IAAIE,EAAeH,EACnB,QAASI,EAAI,EAAGA,EAAIH,EAAU,OAAQG,IACpCD,EAAUA,EAAQF,EAAUG,IAC1BD,EAAQF,EAAUG,KAAO,IAAKC,EAGlC,OAAOF,CACT,KACE,OAAM,IAAI,UAAU,uCAAuC,MAG7D,OAAM,IAAI,UAAU,kCAAkC,CAE1D,CCxBe,SAARG,EAAsBC,EAAiBC,EAA2B,CACvE,QAAQ,KAAKD,CAAO,CACtB,CCOe,SAARE,EACLC,EACAC,EACM,CACN,GAAI,UAAU,SAAW,EACvB,MAAM,IAAI,MACR,8DACF,EAGF,GAAI,MAAM,QAAQA,CAAK,EACrB,QAASC,KAAQD,EAAO,CACtB,GAAM,CAAE,KAAME,CAAS,EAAIC,EAAUF,CAAI,EAEzC,GAAIC,EACFJ,EAAOC,EAAME,CAAI,MAEjB,OAAM,IAAI,MACR,8GACF,CAEJ,KACK,CACL,IAAIG,EACAC,EAMJ,GAJI,OAAOL,GAAU,aACnBI,EAAUD,EAAUH,CAAK,EAAE,MAGzB,OAAOD,GAAS,SAAU,CAC5B,IAAIO,EAAYP,EAAK,MAAM,GAAG,EAEzBK,IACHA,EAAUE,EAAUA,EAAU,OAAS,GACvCA,EAAYA,EAAU,MAAM,EAAGA,EAAU,OAAS,CAAC,GAGrDD,EAAYE,EAAiB,OAAQD,CAAS,CAChD,SACEF,IACC,OAAOL,GAAS,UAAY,OAAOA,GAAS,YAE7CM,EAAYN,MAEZ,OAAM,IAAI,UACR,6DACF,EAGES,EAAIH,EAAWD,CAAO,EAExBK,EAAK,CAACV,EAAMK,CAAO,EAAE,KAAK,GAAG,EAAI,sBAAsB,EAEvDC,EAAUD,GAAWJ,CAEzB,CACF,CCnEA,eAAeU,EAAwBC,EAAgB,CACrD,GAAI,CACF,IAAIC,EAAW,MAAM,MAAM,qBAAsB,CAC/C,KAAM,KAAK,UAAU,CAAE,OAAAD,CAAO,CAAC,EAC/B,QAAS,CACP,OAAQ,wBACR,eAAgB,mBAChB,mBAAoB,gBACtB,EACA,OAAQ,MACV,CAAC,EAED,GAAIC,EAAS,GACX,OAAQ,MAAMA,EAAS,KAAK,CAEhC,MAAE,CAAe,CAEjB,OAAOD,CACT,CAKA,SAASE,EACPF,EACAG,EAC0B,CAC1B,GAAI,IAAI,SAAS,OAAS,OAAW,CACnC,GAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,QAAQ,KAAMH,CAAM,EAAG,CAClE,GAAG,QAAQ,KAAKA,GAAUA,EAE1B,IAAII,EAAUL,EAAwBC,CAAM,EAAE,KAAMK,IAClD,GAAG,QAAQ,KAAKL,GAAUK,EACnBA,EACR,EAED,GAAIF,EACF,OAAOC,CAEX,CAEA,OAAO,GAAG,QAAQ,KAAKJ,EACzB,KACE,QAAOA,CAEX,CAUA,IAAMM,EAAM,0BACNC,EAAc,OAAOD,IAAQ,IAAI,IAElC,OAAOA,KACV,OAAOA,GAAOC,GAGhB,SAASC,GAAyB,CAC5B,SAAS,aAAe,YAC1BC,EAAkB,EAClB,SAAS,oBAAoB,mBAAoBD,CAAsB,EAE3E,CAEI,SAAS,aAAe,UAC1BC,EAAkB,EAElB,SAAS,iBAAiB,mBAAoBD,CAAsB,EAGtE,SAASE,GAAc,CACrB,GAAM,CAAE,GAAAC,CAAG,EAAI,OAEf,OAAOA,GAAMA,EAAG,aAAeA,EAAG,YAAY,WAChD,CAEA,SAASF,GAAoB,CAC3B,GAAIC,EAAY,EAAG,CACjB,GAAI,OAAO,OAAO,wBAA2B,WAAY,CACvD,IAAME,EAAe,OAAO,uBAAuB,EAEnD,QAASZ,KAAU,OAAO,KAAKY,CAAY,EACzCL,EAAY,IAAIP,CAAM,CAE1B,CAEK,OAAOM,KACV,OAAOA,GAAOC,GAGX,OAAO,0BACV,OAAO,wBAA0B,SAAUM,EAAgB,CACzD,IAAMC,EAAU,CAAC,EAEjB,QAASd,KAAUO,EACjB,GAAIP,EAAQ,CACV,IAAMe,EAAUf,EAAO,QAAQ,KAAM,KAAK,EAC1C,GAAIa,EAAgB,CAClB,IAAMG,EAAYd,EAAqBF,CAAM,EAAE,WAC7C,KACA,KACF,EACAc,EAAQ,KAAK,IAAIC,QAAcC,KAAa,CAC9C,MACEF,EAAQ,KACN,MAAMC,8CAAoDf,EAAO,WAC/D,IACA,KACF,OACF,CAEJ,CAGF,OAAIa,EACK;AAAA;AAAA;AAAA,IAGbC,EAAQ,KAAK;AAAA,GAAQ;AAAA;AAAA;AAAA;AAAA,GAOV;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMbA,EAAQ,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,WAIb,EAEJ,CACF,CAEO,SAASG,EAAmBjB,EAAgB,CACjD,IAAMgB,EAAYd,EAAqBF,CAAM,EAC7C,OAAIgB,IAAchB,GAAU,CAACO,EAAY,IAAIP,CAAM,GACjDO,EAAY,IAAIP,CAAM,EAGjBgB,CACT,CCxJA,SAASE,EAAYC,EAAqB,CACxC,MAAO,CAAC,IAAI,SAAS,IAAM,GAAI,SAAUA,CAAG,EAAE,KAAK,GAAG,CACxD,CAEA,IAAMC,EAAN,KAAmB,CACjB,aAAc,CACZ,MAAO,EACT,CAEA,mBAAmBD,EAAaE,EAAkB,CAChD,OAAOA,EAAS,CAAC,SAAUF,CAAG,EAAE,KAAK,GAAG,EAAID,EAAYC,CAAG,CAC7D,CAEA,IAAIA,EAAaG,EAAuBD,EAAkB,CACxD,IAAME,EAAQ,KAAK,mBAAmBJ,EAAKE,CAAM,EAC3CG,EAAQ,aAAa,QAAQD,CAAK,EAExC,OAAOC,IAAU,KAAO,KAAK,MAAMA,CAAK,EAAIF,CAC9C,CAEA,IAAIH,EAAaK,EAAgBH,EAAkB,CACjD,aAAa,QACX,KAAK,mBAAmBF,EAAKE,CAAM,EACnC,KAAK,UAAUG,CAAK,CACtB,CACF,CAEA,OAAOL,EAAaE,EAAkB,CACpC,IAAME,EAAQ,KAAK,mBAAmBJ,EAAKE,CAAM,EACjD,OAAI,aAAa,QAAQE,CAAK,IAAM,MAClC,aAAa,WAAWA,CAAK,EACtB,IAEA,EAEX,CAEA,OAAQ,CACN,IAAME,EAAUP,EAAY,EAAE,EAE9B,QAASC,KAAO,aACVA,EAAI,MAAM,EAAGM,EAAQ,MAAM,IAAMA,GACnC,aAAa,WAAWN,CAAG,CAGjC,CACF,EAEOO,EAAQ,IAAIN,EC3CnB,IAAqBO,EAArB,KAAoC,CAApC,cAME,KAAQ,aAAoEC,EAAK,EACjF,KAAQ,cAAgB,GACxB,KAAQ,OAAS,KAEjB,QAAQC,EAAoB,CAK1B,GAJA,GAAG,YAAc,GAAG,aAAe,CACjC,MAAO,IACT,EAEI,OAAOA,GAAa,WACtB,MAAM,IAAI,UAAU,wEAAwE,EAG9F,IAAMC,EAAO,IAAM,CACjB,KAAK,YAAY,kBAAmBA,CAAI,EACxCD,EAAS,CACX,EAIA,GAFA,KAAK,YAAY,kBAAmBC,CAAI,EAEpC,KAAK,gBAAkB,GAAM,CAC/B,KAAK,cAAgB,GACrB,IAAMC,EAAmB,SAAS,cAAc,KAAK,EACrDA,EAAiB,UAAY,4BAC7BA,EAAiB,UAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAMHC,EAAmB,UAAU;AAAA;AAAA;AAAA;AAAA,gCAI7BA,EAAmB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAM/CA,EAAmB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanC,IAAMC,EAAU,GAAG,YAAY,MAAQN,EAAe,SAAS,MAAQA,EAAe,SAAS,MAEzFO,EAAcH,EAAiB,cAAc,UAAU,EACvDI,EAAaJ,EAAiB,cAAc,gBAAgB,EAC5DK,EAAWL,EAAiB,cAAc,kBAAkB,EAC5DM,EAAaN,EAAiB,cAAc,UAAU,EACtDO,EAAeP,EAAiB,cAAc,sBAAsB,EAE1E,GACEG,IAAgB,MAChBE,IAAa,MACbD,IAAe,MACfC,IAAa,MACbC,IAAe,MACfC,IAAiB,KACjB,CACAJ,EAAY,UAAYF,EAAmBC,CAAO,EAElDG,EAAS,MAAQ,GAAG,YAAY,OAAS,GACzCA,EAAS,SAAW,CAAC,CAAC,GAAG,YAAY,MACrCA,EAAS,SAAW,CAAC,CAAC,GAAG,YAAY,MAErC,SAAS,KAAK,YAAYL,CAAgB,EAE1C,IAAMQ,EAAU,SAAY,CAC1BD,EAAa,SAAW,GAExB,IAAME,EAAU,IAAI,QAAQ,SAAU,CACpC,KAAM,KAAK,UAAU,CACnB,SAAUJ,EAAS,MACnB,SAAUE,EAAa,MACvB,SAAU,EACZ,CAAC,EACD,QAAS,CACP,OAAQ,mBACR,eAAgB,kCAChB,mBAAoB,gBACtB,EACA,OAAQ,MACV,CAAC,EAED,GAAI,CAEF,IAAMG,EAAO,MADI,MAAM,MAAMD,CAAO,GACR,KAAK,EAEjC,GAAIC,EAAK,QACP,SAAS,KAAK,YAAYV,CAAgB,EAC1C,KAAK,cAAgB,GACrB,KAAK,aAAa,KAAK,iBAAiB,EAEpCI,EAAW,aACZA,EAAW,WAA2B,MAAM,QAAU,YAGzD,OAAM,IAAI,MAAMM,EAAK,KAAK,CAE9B,OAASC,EAAP,CACA,GAAIA,GAAO,OAAOA,GAAQ,SAAU,CAClC,IAAIC,EAAQD,EACZJ,EAAa,SAAW,GACxBA,EAAa,UAAU,OAAO,UAAW,EAAI,EAC7CA,EAAa,MAAQ,GACrBA,EAAa,MAAM,EACnBH,EAAW,UAAYQ,EAAM,QAAUA,EAAM,QAAU,OAAOA,CAAK,EAE/DR,EAAW,aACZA,EAAW,WAA2B,MAAM,QAAU,UAE3D,CACF,CACF,EAEAE,EAAW,iBAAiB,QAASE,CAAO,EAE5CD,EAAa,iBAAiB,QAASM,GAAO,CACxCA,EAAI,MAAQ,SACdL,EAAQ,CAEZ,CAAC,EAEDD,EAAa,iBAAiB,SAAUM,GAAO,CACxCA,EAAsB,MAAQ,SACjCL,EAAQ,CAEZ,CAAC,EAEDH,EAAS,iBAAiB,QAASQ,GAAO,CACpCA,EAAI,MAAQ,SACdL,EAAQ,CAEZ,CAAC,EAEDH,EAAS,iBAAiB,SAAUQ,GAAO,CACpCA,EAAsB,MAAQ,SACjCL,EAAQ,CAEZ,CAAC,EAEDD,EAAa,MAAM,CACrB,CACF,CACF,CAEA,YAAYO,EAAgCC,EAAkB,CAC5D,OAAO,KAAK,aAAa,GAAGD,EAAWC,CAAO,CAChD,CAEA,YAAYD,EAAgCC,EAAkB,CAC5D,OAAO,KAAK,aAAa,IAAID,EAAWC,CAAO,CACjD,CACF,EAzKqBC,EAArBpB,EAAqBoB,EACZ,SAAW,CAChB,MAAO,SACP,MAAO,0BACT,ECPF,IAAqBC,EAArB,cAAyCC,CAAe,CAQtD,YAAYC,EAAe,CACzB,MAAM,EARR,sBAA2B,IAE3B,oBAAgC,KAChC,qBAA0B,aAC1B,WAAuB,KACvB,iBAAuB,GAIrB,KAAK,QAAU,CAAC,EAChB,OAAO,OAAO,KAAMA,CAAQ,CAC9B,CACF,ECbA,SAASC,EAAaC,EAAeC,EAA4E,CAC/G,GAAID,IAAU,GACZ,OAAO,KACF,GAAIC,IAAS,SAAU,CAC5B,IAAIC,EAAW,OAAOF,CAAK,EAE3B,OAAO,MAAME,CAAQ,EAAI,OAAYA,CACvC,SAAW,CAAC,OAAQ,WAAY,MAAM,EAAE,SAASD,CAAI,EAAG,CACtD,IAAIE,EAAY,IAAI,KAAKH,CAAK,EAE9B,OAAO,MAAMG,EAAU,QAAQ,CAAC,EAAI,OAAYA,CAClD,KAAO,IAAIF,IAAS,UAClB,OAAOD,EAAM,YAAY,IAAM,OAC1B,GAAIC,IAAS,SAClB,OAAO,OAAOD,CAAK,EAGrB,OAAOA,CACT,CAQO,SAASI,EAA0BC,EAAuBC,EAAkC,CAAC,EAAe,CACjH,IAAIC,EAAW,IAAI,SAASF,CAAI,EAC5BG,EAAc,CAAC,EAEnB,QAASC,KAASF,EAAS,QAAQ,EAAG,CACpC,IAAIG,EAAQD,EAAM,GACdR,EAAOK,IAAUI,IAAU,SAC3BV,EAAQD,EAAaU,EAAM,GAAcR,CAAI,EAE7CO,EAAO,eAAeE,CAAK,EACzB,MAAM,QAAQF,EAAOE,EAAM,EAC7BF,EAAOE,GAAO,KAAKV,CAAK,EAExBQ,EAAOE,GAAS,CAACF,EAAOE,GAAQV,CAAK,EAGvCQ,EAAOE,GAASV,CAEpB,CAEA,OAAOQ,CACT,CAUO,SAASG,EAA8BN,EAAuBO,EAAuC,CAC1G,IAAIC,EAASD,EAAW,UAAU,EAC9BE,EAAQ,OAAO,YAAYD,EAAO,IAAKH,GAAU,CAACA,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EAE9E,OAAON,EAAoBC,EAAMS,CAAK,CACxC,CAUO,SAASC,EAAiCV,EAAuBW,EAAiC,CACvG,IAAIC,EAAaD,EAAU,cAAc,EACrCF,EAAQ,OAAO,YAAYG,EAAW,IAAKC,GAAU,CAACA,EAAM,KAAMA,EAAM,IAAI,CAAC,CAAC,EAElF,OAAOd,EAAiBC,EAAMS,CAAK,CACrC,CC/EA,SAASK,EAAOC,EAAkB,CAEhC,MAAO,GADYA,GAAW,GAAG,QAAQ,MACjB,GAAG,YAAY,OACzC,CAEO,SAASC,GAAeC,EAAiBF,EAA4B,CAC1E,GAAI,CAAC,IAAI,YAAa,OAAO,KAE7B,IAAMG,EAAMJ,EAAOC,CAAO,EACpBI,EAAW,KAAK,MAAM,aAAa,QAAQD,CAAG,GAAK,IAAI,EAE7D,OAAID,EACKE,EAASF,IAAY,KAGvBE,CACT,CAEO,SAASC,GACdH,EACAI,EACAN,EACM,CACN,GAAI,CAAC,IAAI,YAAa,OAEtB,IAAMG,EAAMJ,EAAOC,CAAO,EACtBO,EAAe,KAAK,MAAM,aAAa,QAAQJ,CAAG,GAAK,IAAI,EAE3D,OAAOG,EAAU,IACnBC,EAAaL,GAAWI,EAExBC,EAAeL,EAGjB,aAAa,QAAQC,EAAK,KAAK,UAAUI,CAAY,CAAC,CACxD,CCpBO,IAAMC,GAAU",
6
+ "names": ["event", "data", "all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "downloadBlob", "blob", "fileName", "resolve", "reject", "url", "parent", "anchor", "ex", "downloadRequest", "request", "fileName", "controller", "onProgress", "reportProgress", "progress", "bytesReceived", "response", "data", "reader", "stream", "pump", "read", "blob", "downloadBlob", "err", "exportOptionsFromDataObject", "dataObject", "specifiedOptions", "field", "defaultOptions", "getDataObjectReportRequest", "params", "articleId", "format", "options", "reportOptions", "body", "requestUrl", "controller", "openDataObjectReport", "fileName", "request", "downloadRequest", "has", "obj", "key", "funcRegex", "parseFunc", "func", "match", "Namespace", "Namespace_default", "requireNamespace", "root", "namespace", "path", "current", "i", "Namespace_default", "warn", "message", "fallbackToAlert", "expose", "name", "value", "func", "funcName", "parseFunc", "keyName", "namespace", "pathParts", "requireNamespace", "has", "warn", "getLocalizedStringAsync", "string", "response", "afGetLocalizedString", "wait", "promise", "text", "key", "localizeSet", "handleReadyStateChange", "addDeveloperUtils", "isDeveloper", "af", "addedStrings", "forCustomRoute", "strings", "escaped", "localized", "getLocalizedString", "getLocalKey", "key", "LocalStorage", "global", "defaultValue", "lsKey", "value", "baseKey", "localStorage_default", "_SessionHandler", "mitt_default", "callback", "once", "contentContainer", "getLocalizedString", "message", "messageElem", "statusElem", "userElem", "signInElem", "passwordElem", "doLogin", "request", "json", "err", "error", "evt", "eventName", "handler", "SessionHandler", "UserSession", "SessionHandler", "userData", "getFormValue", "value", "type", "numValue", "dateValue", "formDataToObject", "form", "typeMap", "formData", "result", "entry", "field", "formDataToDataObjectRecord", "dataObject", "fields", "types", "formDataToProcedureParameters", "procedure", "parameters", "param", "getKey", "article", "getSettings", "setting", "key", "settings", "saveSettings", "value", "userSettings", "version"]
7
7
  }
@@ -4,21 +4,7 @@ af.common = (() => {
4
4
  var __defProp = Object.defineProperty;
5
5
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
- var __defNormalProp = (obj, key2, value) => key2 in obj ? __defProp(obj, key2, { enumerable: true, configurable: true, writable: true, value }) : obj[key2] = value;
11
- var __spreadValues = (a, b) => {
12
- for (var prop in b || (b = {}))
13
- if (__hasOwnProp.call(b, prop))
14
- __defNormalProp(a, prop, b[prop]);
15
- if (__getOwnPropSymbols)
16
- for (var prop of __getOwnPropSymbols(b)) {
17
- if (__propIsEnum.call(b, prop))
18
- __defNormalProp(a, prop, b[prop]);
19
- }
20
- return a;
21
- };
22
8
  var __export = (target, all) => {
23
9
  for (var name in all)
24
10
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -55,6 +41,29 @@ af.common = (() => {
55
41
  version: () => version
56
42
  });
57
43
 
44
+ // src/errorHandler.ts
45
+ window.addEventListener("error", (event) => {
46
+ try {
47
+ const data = {
48
+ error: event.message ?? null,
49
+ file: event.filename,
50
+ line: event.lineno ?? 0,
51
+ column: event.colno ?? 0,
52
+ stack: null
53
+ };
54
+ fetch("/data/Logger/LogError", {
55
+ body: JSON.stringify(data),
56
+ headers: {
57
+ Accept: "application/json",
58
+ "Content-Type": "application/json; charset=utf-8",
59
+ "X-Requested-With": "XMLHttpRequest"
60
+ },
61
+ method: "POST"
62
+ });
63
+ } catch (ex) {
64
+ }
65
+ });
66
+
58
67
  // ../../node_modules/mitt/dist/mitt.mjs
59
68
  function mitt_default(n) {
60
69
  return { all: n = n || /* @__PURE__ */ new Map(), on: function(t, e) {
@@ -97,10 +106,9 @@ af.common = (() => {
97
106
 
98
107
  // src/downloadRequest.ts
99
108
  async function downloadRequest(request, { fileName, controller, onProgress }) {
100
- var _a, _b;
101
109
  function reportProgress(progress) {
102
110
  if (typeof onProgress === "function") {
103
- onProgress(__spreadValues({}, progress));
111
+ onProgress({ ...progress });
104
112
  }
105
113
  }
106
114
  let bytesReceived = 0;
@@ -108,7 +116,7 @@ af.common = (() => {
108
116
  try {
109
117
  let response = await fetch(request);
110
118
  if (!response.ok || !response.body) {
111
- if ((_a = response.headers.get("content-type")) == null ? void 0 : _a.includes("application/json")) {
119
+ if (response.headers.get("content-type")?.includes("application/json")) {
112
120
  let data = await response.json();
113
121
  if (data.error) {
114
122
  throw new Error(data.error);
@@ -144,7 +152,7 @@ af.common = (() => {
144
152
  await downloadBlob(blob, fileName);
145
153
  reportProgress({ bytesReceived, status: "completed" });
146
154
  } catch (err) {
147
- if ((_b = controller == null ? void 0 : controller.signal) == null ? void 0 : _b.aborted) {
155
+ if (controller?.signal?.aborted) {
148
156
  reportProgress({ status: "cancelled" });
149
157
  } else {
150
158
  reportProgress({ error: err.message, status: "error" });
@@ -154,7 +162,7 @@ af.common = (() => {
154
162
 
155
163
  // src/exportDataObject.ts
156
164
  function exportOptionsFromDataObject(dataObject, specifiedOptions) {
157
- return __spreadValues({
165
+ return {
158
166
  columns: dataObject.getFields().map((field) => ({ name: field.name })),
159
167
  distinctRows: dataObject.getParameter("distinctRows"),
160
168
  filterObject: dataObject.getParameter("filterObject"),
@@ -162,8 +170,9 @@ af.common = (() => {
162
170
  maxRecords: dataObject.getParameter("maxRecords"),
163
171
  sortOrder: dataObject.getParameter("sortOrder"),
164
172
  whereClause: dataObject.getParameter("whereClause"),
165
- whereObject: dataObject.getParameter("whereObject")
166
- }, specifiedOptions);
173
+ whereObject: dataObject.getParameter("whereObject"),
174
+ ...specifiedOptions
175
+ };
167
176
  }
168
177
  var defaultOptions = {
169
178
  columns: [],
@@ -176,12 +185,11 @@ af.common = (() => {
176
185
  whereObject: null
177
186
  };
178
187
  function getDataObjectReportRequest(params) {
179
- var _a;
180
188
  const { articleId, dataObject, format, options } = params;
181
189
  const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;
182
190
  const body = "data=" + encodeURIComponent(JSON.stringify(reportOptions));
183
191
  const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;
184
- const controller = (_a = params.controller) != null ? _a : new AbortController();
192
+ const controller = params.controller ?? new AbortController();
185
193
  return {
186
194
  controller,
187
195
  request: new Request(requestUrl, {
@@ -315,8 +323,7 @@ af.common = (() => {
315
323
  return string;
316
324
  }
317
325
  function afGetLocalizedString(string, wait) {
318
- var _a;
319
- if (((_a = af == null ? void 0 : af.article) == null ? void 0 : _a.i18n) !== void 0) {
326
+ if (af?.article?.i18n !== void 0) {
320
327
  if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {
321
328
  af.article.i18n[string] = string;
322
329
  let promise = getLocalizedStringAsync(string).then((text) => {
@@ -419,8 +426,7 @@ return s;
419
426
 
420
427
  // src/localStorage.ts
421
428
  function getLocalKey(key2) {
422
- var _a;
423
- return [((_a = af == null ? void 0 : af.article) == null ? void 0 : _a.id) || "", "common", key2].join(".");
429
+ return [af?.article?.id || "", "common", key2].join(".");
424
430
  }
425
431
  var LocalStorage = class {
426
432
  isPersisted() {
@@ -636,12 +642,11 @@ return s;
636
642
  return value;
637
643
  }
638
644
  function formDataToObject(form, typeMap = {}) {
639
- var _a;
640
645
  let formData = new FormData(form);
641
646
  let result = {};
642
647
  for (let entry of formData.entries()) {
643
648
  let field = entry[0];
644
- let type = (_a = typeMap == null ? void 0 : typeMap[field]) != null ? _a : "string";
649
+ let type = typeMap?.[field] ?? "string";
645
650
  let value = getFormValue(entry[1], type);
646
651
  if (result.hasOwnProperty(field)) {
647
652
  if (Array.isArray(result[field])) {
@@ -672,7 +677,7 @@ return s;
672
677
  return `${articleKey}.${af.userSession.login}`;
673
678
  }
674
679
  function getSettings(setting, article) {
675
- if (!(af == null ? void 0 : af.userSession))
680
+ if (!af?.userSession)
676
681
  return null;
677
682
  const key2 = getKey(article);
678
683
  const settings = JSON.parse(localStorage.getItem(key2) || "{}");
@@ -682,7 +687,7 @@ return s;
682
687
  return settings;
683
688
  }
684
689
  function saveSettings(setting, value, article) {
685
- if (!(af == null ? void 0 : af.userSession))
690
+ if (!af?.userSession)
686
691
  return;
687
692
  const key2 = getKey(article);
688
693
  let userSettings = JSON.parse(localStorage.getItem(key2) || "{}");
@@ -695,6 +700,6 @@ return s;
695
700
  }
696
701
 
697
702
  // src/index.ts
698
- var version = "1.2.3";
703
+ var version = "1.3.0";
699
704
  return __toCommonJS(src_exports);
700
705
  })();
@@ -1,7 +1,7 @@
1
- "use strict";var af=af||{};af.common=(()=>{var h=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames,_=Object.getOwnPropertySymbols;var H=Object.prototype.hasOwnProperty,V=Object.prototype.propertyIsEnumerable;var I=(t,e,r)=>e in t?h(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,S=(t,e)=>{for(var r in e||(e={}))H.call(e,r)&&I(t,r,e[r]);if(_)for(var r of _(e))V.call(e,r)&&I(t,r,e[r]);return t};var X=(t,e)=>{for(var r in e)h(t,r,{get:e[r],enumerable:!0})},Q=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of G(e))!H.call(t,o)&&o!==r&&h(t,o,{get:()=>e[o],enumerable:!(n=B(e,o))||n.enumerable});return t};var Y=t=>Q(h({},"__esModule",{value:!0}),t);var ce={};X(ce,{SessionHandler:()=>p,UserSession:()=>b,downloadBlob:()=>v,downloadRequest:()=>R,exportOptionsFromDataObject:()=>ee,expose:()=>T,formDataToDataObjectRecord:()=>J,formDataToObject:()=>L,formDataToProcedureParameters:()=>W,getDataObjectReportRequest:()=>z,getLocalizedString:()=>m,getSettings:()=>se,localStorage:()=>M,mitt:()=>x,openDataObjectReport:()=>te,saveSettings:()=>ie,version:()=>le});function x(t){return{all:t=t||new Map,on:function(e,r){var n=t.get(e);n?n.push(r):t.set(e,[r])},off:function(e,r){var n=t.get(e);n&&(r?n.splice(n.indexOf(r)>>>0,1):t.set(e,[]))},emit:function(e,r){var n=t.get(e);n&&n.slice().map(function(o){o(r)}),(n=t.get("*"))&&n.slice().map(function(o){o(e,r)})}}}function v(t,e){return new Promise(function(r,n){try{let o=URL.createObjectURL(t),i=document.body,a=document.createElement("a");a.setAttribute("download",e),a.href=o,i.append(a),a.click(),i.removeChild(a),setTimeout(function(){URL.revokeObjectURL(o),r()},250)}catch(o){n(o)}})}async function R(t,{fileName:e,controller:r,onProgress:n}){var a,l;function o(s){typeof n=="function"&&n(S({},s))}let i=0;o({status:"requested"});try{let s=await fetch(t);if(!s.ok||!s.body){if((a=s.headers.get("content-type"))!=null&&a.includes("application/json")){let d=await s.json();if(d.error)throw new Error(d.error)}throw new Error(s.status+" "+s.statusText)}try{let d=s.body.getReader(),u=new ReadableStream({start:function(g){function f(){return d.read().then(function(D){if(D.done){g.close();return}return i+=D.value.length,o({bytesReceived:i,status:"downloading"}),g.enqueue(D.value),f()})}return f()}});s=new Response(u)}catch(d){console.warn("Failed to replace response stream to log download progress.")}let c=await s.blob();o({bytesReceived:i,status:"downloaded"}),await v(c,e),o({bytesReceived:i,status:"completed"})}catch(s){(l=r==null?void 0:r.signal)!=null&&l.aborted?o({status:"cancelled"}):o({error:s.message,status:"error"})}}function ee(t,e){return S({columns:t.getFields().map(r=>({name:r.name})),distinctRows:t.getParameter("distinctRows"),filterObject:t.getParameter("filterObject"),filterString:t.getParameter("filterString"),maxRecords:t.getParameter("maxRecords"),sortOrder:t.getParameter("sortOrder"),whereClause:t.getParameter("whereClause"),whereObject:t.getParameter("whereObject")},e)}var q={columns:[],distinctRows:!1,filterObject:null,filterString:"",maxRecords:-1,sortOrder:[],whereClause:"",whereObject:null};function z(t){var c;let{articleId:e,dataObject:r,format:n,options:o}=t,i=o?Object.assign({},q,o):q,a="data="+encodeURIComponent(JSON.stringify(i)),l=`/api/data-object/export/${e}/${r}/${n}`,s=(c=t.controller)!=null?c:new AbortController;return{controller:s,request:new Request(l,{body:a,credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST",signal:s.signal})}}function te(t){let{dataObject:e,fileName:r,format:n}=t,{request:o}=z(t);return R(o,{fileName:`${r||e}.${n}`})}function N(t,e){return Object.prototype.hasOwnProperty.call(t,e)}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 E(t){var e=t.toString().match(re);if(e===null)throw new TypeError("Unable to parse function!");return{name:e[1],args:e[2].split(","),body:e[3]}}function C(){}C.prototype=Object.create(null);var $=C;function O(t,e){if(typeof t=="object")if(typeof e=="string"){let r=e.split(".");return O(t,r)}else if(Array.isArray(e)){let r=t;for(let n=0;n<e.length;n++)r=r[e[n]]=r[e[n]]||new $;return r}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function P(t,e){console.warn(t)}function T(t,e){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(e))for(let r of e){let{name:n}=E(r);if(n)T(t,r);else throw new Error("Unable to detect name of function! Name it, or only supply one function and include name in first parameter.")}else{let r,n;if(typeof e=="function"&&(r=E(e).name),typeof t=="string"){let o=t.split(".");r||(r=o[o.length-1],o=o.slice(0,o.length-1)),n=O(window,o)}else if(r&&(typeof t=="object"||typeof t=="function"))n=t;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");N(n,r)?P([t,r].join(".")+" is already defined!"):n[r]=e}}async function ne(t){try{let e=await fetch("/api/user/localize",{body:JSON.stringify({string:t}),headers:{Accept:"application/json; */*","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},method:"POST"});if(e.ok)return await e.json()}catch(e){}return t}function k(t,e){var r;if(((r=af==null?void 0:af.article)==null?void 0:r.i18n)!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,t)){af.article.i18n[t]=t;let n=ne(t).then(o=>(af.article.i18n[t]=o,o));if(e)return n}return af.article.i18n[t]}else return t}var w="__UNLOCALIZED_STRINGS__",y=window[w]||new Set;window[w]||(window[w]=y);function F(){document.readyState!=="loading"&&(U(),document.removeEventListener("readystatechange",F))}document.readyState!=="loading"?U():document.addEventListener("readystatechange",F);function oe(){let{af:t}=window;return t&&t.userSession&&t.userSession.isDeveloper}function U(){if(oe()){if(typeof window.__doNothingWithStrings=="function"){let t=window.__doNothingWithStrings();for(let e of Object.keys(t))y.add(e)}window[w]||(window[w]=y),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(t){let e=[];for(let r of y)if(r){let n=r.replace(/'/g,"\\'");if(t){let o=k(r).replaceAll(/'/g,"\\'");e.push(`'${n}': '${o}',`)}else e.push(`s['${n}'] = @Html(@context.AddLocalizableString("${r.replaceAll('"','\\"')}"));`)}return t?`// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used
1
+ "use strict";var af=af||{};af.common=(()=>{var j=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var W=(e,t)=>{for(var r in t)j(e,r,{get:t[r],enumerable:!0})},Z=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of K(t))!J.call(e,o)&&o!==r&&j(e,o,{get:()=>t[o],enumerable:!(n=U(t,o))||n.enumerable});return e};var B=e=>Z(j({},"__esModule",{value:!0}),e);var oe={};W(oe,{SessionHandler:()=>p,UserSession:()=>b,downloadBlob:()=>S,downloadRequest:()=>L,exportOptionsFromDataObject:()=>G,expose:()=>E,formDataToDataObjectRecord:()=>$,formDataToObject:()=>T,formDataToProcedureParameters:()=>F,getDataObjectReportRequest:()=>A,getLocalizedString:()=>g,getSettings:()=>te,localStorage:()=>k,mitt:()=>h,openDataObjectReport:()=>X,saveSettings:()=>re,version:()=>ne});window.addEventListener("error",e=>{try{let t={error:e.message??null,file:e.filename,line:e.lineno??0,column:e.colno??0,stack:null};fetch("/data/Logger/LogError",{body:JSON.stringify(t),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"})}catch{}});function h(e){return{all:e=e||new Map,on:function(t,r){var n=e.get(t);n?n.push(r):e.set(t,[r])},off:function(t,r){var n=e.get(t);n&&(r?n.splice(n.indexOf(r)>>>0,1):e.set(t,[]))},emit:function(t,r){var n=e.get(t);n&&n.slice().map(function(o){o(r)}),(n=e.get("*"))&&n.slice().map(function(o){o(t,r)})}}}function S(e,t){return new Promise(function(r,n){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),r()},250)}catch(o){n(o)}})}async function L(e,{fileName:t,controller:r,onProgress:n}){function o(a){typeof n=="function"&&n({...a})}let i=0;o({status:"requested"});try{let a=await fetch(e);if(!a.ok||!a.body){if(a.headers.get("content-type")?.includes("application/json")){let d=await a.json();if(d.error)throw new Error(d.error)}throw new Error(a.status+" "+a.statusText)}try{let d=a.body.getReader(),l=new ReadableStream({start:function(u){function c(){return d.read().then(function(f){if(f.done){u.close();return}return i+=f.value.length,o({bytesReceived:i,status:"downloading"}),u.enqueue(f.value),c()})}return c()}});a=new Response(l)}catch{console.warn("Failed to replace response stream to log download progress.")}let s=await a.blob();o({bytesReceived:i,status:"downloaded"}),await S(s,t),o({bytesReceived:i,status:"completed"})}catch(a){r?.signal?.aborted?o({status:"cancelled"}):o({error:a.message,status:"error"})}}function G(e,t){return{columns:e.getFields().map(r=>({name:r.name})),distinctRows:e.getParameter("distinctRows"),filterObject:e.getParameter("filterObject"),filterString:e.getParameter("filterString"),maxRecords:e.getParameter("maxRecords"),sortOrder:e.getParameter("sortOrder"),whereClause:e.getParameter("whereClause"),whereObject:e.getParameter("whereObject"),...t}}var P={columns:[],distinctRows:!1,filterObject:null,filterString:"",maxRecords:-1,sortOrder:[],whereClause:"",whereObject:null};function A(e){let{articleId:t,dataObject:r,format:n,options:o}=e,i=o?Object.assign({},P,o):P,a="data="+encodeURIComponent(JSON.stringify(i)),s=`/api/data-object/export/${t}/${r}/${n}`,d=e.controller??new AbortController;return{controller:d,request:new Request(s,{body:a,credentials:"same-origin",headers:{"Content-Type":"application/x-www-form-urlencoded"},method:"POST",signal:d.signal})}}function X(e){let{dataObject:t,fileName:r,format:n}=e,{request:o}=A(e);return L(o,{fileName:`${r||t}.${n}`})}function R(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var V=/^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 x(e){var t=e.toString().match(V);if(t===null)throw new TypeError("Unable to parse function!");return{name:t[1],args:t[2].split(","),body:t[3]}}function _(){}_.prototype=Object.create(null);var H=_;function v(e,t){if(typeof e=="object")if(typeof t=="string"){let r=t.split(".");return v(e,r)}else if(Array.isArray(t)){let r=e;for(let n=0;n<t.length;n++)r=r[t[n]]=r[t[n]]||new H;return r}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function D(e,t){console.warn(e)}function E(e,t){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(t))for(let r of t){let{name:n}=x(r);if(n)E(e,r);else throw new Error("Unable to detect name of function! Name it, or only supply one function and include name in first parameter.")}else{let r,n;if(typeof t=="function"&&(r=x(t).name),typeof e=="string"){let o=e.split(".");r||(r=o[o.length-1],o=o.slice(0,o.length-1)),n=v(window,o)}else if(r&&(typeof e=="object"||typeof e=="function"))n=e;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");R(n,r)?D([e,r].join(".")+" is already defined!"):n[r]=t}}async function Q(e){try{let t=await fetch("/api/user/localize",{body:JSON.stringify({string:e}),headers:{Accept:"application/json; */*","Content-Type":"application/json","X-Requested-With":"XMLHttpRequest"},method:"POST"});if(t.ok)return await t.json()}catch{}return e}function I(e,t){if(af?.article?.i18n!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,e)){af.article.i18n[e]=e;let r=Q(e).then(n=>(af.article.i18n[e]=n,n));if(t)return r}return af.article.i18n[e]}else return e}var w="__UNLOCALIZED_STRINGS__",y=window[w]||new Set;window[w]||(window[w]=y);function q(){document.readyState!=="loading"&&(z(),document.removeEventListener("readystatechange",q))}document.readyState!=="loading"?z():document.addEventListener("readystatechange",q);function Y(){let{af:e}=window;return e&&e.userSession&&e.userSession.isDeveloper}function z(){if(Y()){if(typeof window.__doNothingWithStrings=="function"){let e=window.__doNothingWithStrings();for(let t of Object.keys(e))y.add(t)}window[w]||(window[w]=y),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(e){let t=[];for(let r of y)if(r){let n=r.replace(/'/g,"\\'");if(e){let o=I(r).replaceAll(/'/g,"\\'");t.push(`'${n}': '${o}',`)}else t.push(`s['${n}'] = @Html(@context.AddLocalizableString("${r.replaceAll('"','\\"')}"));`)}return e?`// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used
2
2
  if (af.userSession.uiculture === 'nb-NO') {
3
3
  const strings = {
4
- ${e.join(`
4
+ ${t.join(`
5
5
  `)}
6
6
  };
7
7
  af.article.i18n = af.article.i18n || {};
@@ -12,27 +12,27 @@ function __doNothingWithStrings() {
12
12
  var context = @Appframe.Web.Context.RequestContext.Current;
13
13
  }
14
14
  let s = {};
15
- ${e.join(`
15
+ ${t.join(`
16
16
  `)}
17
17
  return s;
18
18
  }
19
- <\/script>`})}}function m(t){let e=k(t);return e===t&&!y.has(t)&&y.add(t),e}function K(t){var e;return[((e=af==null?void 0:af.article)==null?void 0:e.id)||"","common",t].join(".")}var A=class{isPersisted(){return!0}getLocalStorageKey(e,r){return r?["common",e].join("."):K(e)}get(e,r,n){let o=this.getLocalStorageKey(e,n),i=localStorage.getItem(o);return i!==null?JSON.parse(i):r}set(e,r,n){localStorage.setItem(this.getLocalStorageKey(e,n),JSON.stringify(r))}remove(e,r){let n=this.getLocalStorageKey(e,r);return localStorage.getItem(n)!==null?(localStorage.removeItem(n),!0):!1}clear(){let e=K("");for(let r in localStorage)r.slice(0,e.length)===e&&localStorage.removeItem(r)}},M=new A;var j=class{constructor(){this.eventHandler=x();this.showingDialog=!1;this.dialog=null}expired(e){if(af.userSession=af.userSession||{login:null},typeof e!="function")throw new TypeError("Parameter pCallback passed to the expired function must be a function!");let r=()=>{this.detachEvent("onAuthenticated",r),e()};if(this.attachEvent("onAuthenticated",r),this.showingDialog!==!0){this.showingDialog=!0;let n=document.createElement("div");n.className="session-expired-container",n.innerHTML=`
19
+ <\/script>`})}}function g(e){let t=I(e);return t===e&&!y.has(e)&&y.add(e),t}function C(e){return[af?.article?.id||"","common",e].join(".")}var N=class{isPersisted(){return!0}getLocalStorageKey(t,r){return r?["common",t].join("."):C(t)}get(t,r,n){let o=this.getLocalStorageKey(t,n),i=localStorage.getItem(o);return i!==null?JSON.parse(i):r}set(t,r,n){localStorage.setItem(this.getLocalStorageKey(t,n),JSON.stringify(r))}remove(t,r){let n=this.getLocalStorageKey(t,r);return localStorage.getItem(n)!==null?(localStorage.removeItem(n),!0):!1}clear(){let t=C("");for(let r in localStorage)r.slice(0,t.length)===t&&localStorage.removeItem(r)}},k=new N;var O=class{constructor(){this.eventHandler=h();this.showingDialog=!1;this.dialog=null}expired(t){if(af.userSession=af.userSession||{login:null},typeof t!="function")throw new TypeError("Parameter pCallback passed to the expired function must be a function!");let r=()=>{this.detachEvent("onAuthenticated",r),t()};if(this.attachEvent("onAuthenticated",r),this.showingDialog!==!0){this.showingDialog=!0;let n=document.createElement("div");n.className="session-expired-container",n.innerHTML=`
20
20
  <div class="session-expired-log-in" style="margin-top: 20px;">
21
21
  <div class="row">
22
22
  <div class="sessionExpired">
23
23
  <h4 class="message">Frakoblet - tidsavbrudd</h4>
24
24
  <div class="form-group">
25
- <label for="username">${m("Username")}</label>
25
+ <label for="username">${g("Username")}</label>
26
26
  <input type="text" class="form-control" id="username" autofocus>
27
27
  </div>
28
28
  <div class="form-group">
29
- <label for="password">${m("Password")}</label>
29
+ <label for="password">${g("Password")}</label>
30
30
  <input type="password" autocomplete="password" class="form-control" id="password" >
31
31
  </div>
32
32
  <div class="form-group">
33
33
  <div>
34
34
  <button type="submit" class="btn btn-default sign-in">
35
- ${m("Log in")}
35
+ ${g("Log in")}
36
36
  </button>
37
37
  </div>
38
38
  </div>
@@ -44,5 +44,5 @@ return s;
44
44
  </div>
45
45
  </div>
46
46
  </div>
47
- `;let o=af.userSession.login?j.messages.relog:j.messages.login,i=n.querySelector(".message"),a=n.querySelector(".alert-warning"),l=n.querySelector("input[type=text]"),s=n.querySelector(".sign-in"),c=n.querySelector("input[type=password]");if(i!==null&&l!==null&&a!==null&&l!==null&&s!==null&&c!==null){i.innerText=m(o),l.value=af.userSession.login||"",l.disabled=!!af.userSession.login,l.readOnly=!!af.userSession.login,document.body.appendChild(n);let d=async()=>{c.disabled=!0;let u=new Request("/login",{body:JSON.stringify({username:l.value,password:c.value,remember:!1}),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"});try{let f=await(await fetch(u)).json();if(f.success)document.body.removeChild(n),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),a.parentNode&&(a.parentNode.style.display="none");else throw new Error(f.error)}catch(g){if(g&&typeof g=="object"){let f=g;c.disabled=!1,c.classList.toggle("invalid",!0),c.value="",c.focus(),a.innerText=f.message?f.message:String(f),a.parentNode&&(a.parentNode.style.display="initial")}}};s.addEventListener("click",d),c.addEventListener("keyup",u=>{u.key==="Enter"&&d()}),c.addEventListener("change",u=>{u.key==="Enter"&&d()}),l.addEventListener("keyup",u=>{u.key==="Enter"&&d()}),l.addEventListener("change",u=>{u.key==="Enter"&&d()}),c.focus()}}}attachEvent(e,r){return this.eventHandler.on(e,r)}detachEvent(e,r){return this.eventHandler.off(e,r)}},p=j;p.messages={login:"Log in",relog:"Session expired - log in"};var b=class extends p{constructor(r){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,r)}};function ae(t,e){if(t==="")return null;if(e==="number"){let r=Number(t);return isNaN(r)?void 0:r}else if(["date","datetime","time"].includes(e)){let r=new Date(t);return isNaN(r.getTime())?void 0:r}else{if(e==="boolean")return t.toLowerCase()==="true";if(e==="bigint")return BigInt(t)}return t}function L(t,e={}){var o;let r=new FormData(t),n={};for(let i of r.entries()){let a=i[0],l=(o=e==null?void 0:e[a])!=null?o:"string",s=ae(i[1],l);n.hasOwnProperty(a)?Array.isArray(n[a])?n[a].push(s):n[a]=[n[a],s]:n[a]=s}return n}function J(t,e){let r=e.getFields(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return L(t,n)}function W(t,e){let r=e.getParameters(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return L(t,n)}function Z(t){return`${t||af.article.id}.${af.userSession.login}`}function se(t,e){if(!(af!=null&&af.userSession))return null;let r=Z(e),n=JSON.parse(localStorage.getItem(r)||"{}");return t?n[t]||null:n}function ie(t,e,r){if(!(af!=null&&af.userSession))return;let n=Z(r),o=JSON.parse(localStorage.getItem(n)||"{}");typeof e!="undefined"?o[t]=e:o=t,localStorage.setItem(n,JSON.stringify(o))}var le="1.2.3";return Y(ce);})();
47
+ `;let o=af.userSession.login?O.messages.relog:O.messages.login,i=n.querySelector(".message"),a=n.querySelector(".alert-warning"),s=n.querySelector("input[type=text]"),d=n.querySelector(".sign-in"),l=n.querySelector("input[type=password]");if(i!==null&&s!==null&&a!==null&&s!==null&&d!==null&&l!==null){i.innerText=g(o),s.value=af.userSession.login||"",s.disabled=!!af.userSession.login,s.readOnly=!!af.userSession.login,document.body.appendChild(n);let u=async()=>{l.disabled=!0;let c=new Request("/login",{body:JSON.stringify({username:s.value,password:l.value,remember:!1}),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"});try{let m=await(await fetch(c)).json();if(m.success)document.body.removeChild(n),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),a.parentNode&&(a.parentNode.style.display="none");else throw new Error(m.error)}catch(f){if(f&&typeof f=="object"){let m=f;l.disabled=!1,l.classList.toggle("invalid",!0),l.value="",l.focus(),a.innerText=m.message?m.message:String(m),a.parentNode&&(a.parentNode.style.display="initial")}}};d.addEventListener("click",u),l.addEventListener("keyup",c=>{c.key==="Enter"&&u()}),l.addEventListener("change",c=>{c.key==="Enter"&&u()}),s.addEventListener("keyup",c=>{c.key==="Enter"&&u()}),s.addEventListener("change",c=>{c.key==="Enter"&&u()}),l.focus()}}}attachEvent(t,r){return this.eventHandler.on(t,r)}detachEvent(t,r){return this.eventHandler.off(t,r)}},p=O;p.messages={login:"Log in",relog:"Session expired - log in"};var b=class extends p{constructor(r){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,r)}};function ee(e,t){if(e==="")return null;if(t==="number"){let r=Number(e);return isNaN(r)?void 0:r}else if(["date","datetime","time"].includes(t)){let r=new Date(e);return isNaN(r.getTime())?void 0:r}else{if(t==="boolean")return e.toLowerCase()==="true";if(t==="bigint")return BigInt(e)}return e}function T(e,t={}){let r=new FormData(e),n={};for(let o of r.entries()){let i=o[0],a=t?.[i]??"string",s=ee(o[1],a);n.hasOwnProperty(i)?Array.isArray(n[i])?n[i].push(s):n[i]=[n[i],s]:n[i]=s}return n}function $(e,t){let r=t.getFields(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return T(e,n)}function F(e,t){let r=t.getParameters(),n=Object.fromEntries(r.map(o=>[o.name,o.type]));return T(e,n)}function M(e){return`${e||af.article.id}.${af.userSession.login}`}function te(e,t){if(!af?.userSession)return null;let r=M(t),n=JSON.parse(localStorage.getItem(r)||"{}");return e?n[e]||null:n}function re(e,t,r){if(!af?.userSession)return;let n=M(r),o=JSON.parse(localStorage.getItem(n)||"{}");typeof t<"u"?o[e]=t:o=e,localStorage.setItem(n,JSON.stringify(o))}var ne="1.3.0";return B(oe);})();
48
48
  //# sourceMappingURL=af.common.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/index.ts", "../../../../node_modules/mitt/src/index.ts", "../../src/downloadBlob.ts", "../../src/downloadRequest.ts", "../../src/exportDataObject.ts", "../../src/has.ts", "../../src/parseFunc.ts", "../../src/Namespace.ts", "../../src/requireNamespace.ts", "../../src/warn.ts", "../../src/expose.ts", "../../src/getLocalizedString.ts", "../../src/localStorage.ts", "../../src/SessionHandler.ts", "../../src/UserSession.ts", "../../src/formDataToObject.ts", "../../src/settings.ts"],
4
- "sourcesContent": ["export { default as mitt } from \"mitt\";\nexport { downloadBlob } from \"./downloadBlob.js\";\nexport * from \"./downloadRequest.js\";\nexport * from \"./exportDataObject.js\";\nexport { default as expose } from \"./expose.js\";\nexport { getLocalizedString } from \"./getLocalizedString.js\";\nexport { default as localStorage } from \"./localStorage.js\";\nexport { default as SessionHandler } from \"./SessionHandler.js\";\nexport { default as UserSession } from \"./UserSession.js\";\nexport { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from \"./formDataToObject.js\";\nexport * from \"./settings.js\";\nexport const version = __VERSION__;\n", "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", "export function downloadBlob(blob: Blob | MediaSource, fileName: string) {\n return new Promise<void>(function (resolve, reject) {\n try {\n const url = URL.createObjectURL(blob);\n const parent = document.body;\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"download\", fileName);\n anchor.href = url;\n parent.append(anchor);\n anchor.click();\n parent.removeChild(anchor);\n\n setTimeout(function () {\n URL.revokeObjectURL(url);\n resolve();\n }, 250);\n } catch (ex) {\n reject(ex);\n }\n });\n}\n", "import { downloadBlob } from \"./downloadBlob.js\";\n\nexport type DownloadItem = {\n status: \"cancelled\" | \"error\" | \"requested\" | \"downloading\" | \"downloaded\" | \"completed\";\n bytesReceived?: number;\n error?: string;\n};\n\nexport type DownloadParameters = {\n controller?: AbortController;\n fileName: string;\n onProgress?: (progress: DownloadItem) => void;\n};\n\nexport async function downloadRequest(request: Request, { fileName, controller, onProgress }: DownloadParameters) {\n function reportProgress(progress: DownloadItem) {\n if (typeof onProgress === \"function\") {\n onProgress({ ...progress });\n }\n }\n\n let bytesReceived = 0;\n\n reportProgress({ status: \"requested\" });\n\n try {\n let response = await fetch(request);\n\n if (!response.ok || !response.body) {\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n let data = await response.json();\n if (data.error) {\n throw new Error(data.error);\n }\n }\n throw new Error(response.status + \" \" + response.statusText);\n }\n\n try {\n const reader = response.body.getReader();\n const stream = new ReadableStream({\n start: function (controller) {\n function pump(): Promise<void> {\n return reader.read().then(function (read) {\n if (read.done) {\n controller.close();\n return;\n }\n\n bytesReceived += read.value.length;\n reportProgress({ bytesReceived, status: \"downloading\" });\n controller.enqueue(read.value);\n\n return pump();\n });\n }\n\n return pump();\n },\n });\n\n response = new Response(stream);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to replace response stream to log download progress.\");\n }\n\n const blob = await response.blob();\n\n reportProgress({ bytesReceived, status: \"downloaded\" });\n\n await downloadBlob(blob, fileName);\n\n reportProgress({ bytesReceived, status: \"completed\" });\n } catch (err) {\n if (controller?.signal?.aborted) {\n reportProgress({ status: \"cancelled\" });\n } else {\n reportProgress({ error: (err as Error).message, status: \"error\" });\n }\n }\n}\n", "import { DataObject, DataObjectOptions } from \"@olenbetong/appframe-data\";\nimport { RetrieveParameters } from \"@olenbetong/appframe-data\";\n\nimport { downloadRequest } from \"./downloadRequest.js\";\n\nexport type DataExportColumn = {\n name: string;\n caption?: string;\n cellFormat?: string;\n format?: string;\n};\n\nexport type DataExportOptions = RetrieveParameters<any> & { columns: DataExportColumn[] };\nexport type DataObjectReportParams = {\n articleId: string;\n controller?: AbortController;\n dataObject: string;\n format: \"pdf\" | \"xlsx\" | \"csv\" | \"xls\";\n fileName?: string;\n options: DataExportOptions;\n id?: string;\n title?: string;\n subTitle?: string;\n /**\n * Whether the title should be shown in the exported file (default true)\n */\n includeTitle?: boolean;\n /**\n * Whether the filter should be shown in the exported file (default true)\n */\n includefilter?: boolean;\n /**\n * Whether we should try to convert from camelCase to human readable names (default true)\n */\n formatHeaders?: boolean;\n /**\n * Whether the header should be frozen on top of the excel file.\n */\n freezeHeader?: boolean;\n};\n\n/**\n * Get columns and retrieve parameters from a data object to be used to create a report.\n * @param dataObject Data object to get parameters and columns from\n * @param specifiedOptions Options to override the data object options\n * @returns\n */\nexport function exportOptionsFromDataObject(\n dataObject: DataObject<any>,\n specifiedOptions: Partial<DataObjectOptions<any>>\n) {\n return {\n columns: dataObject.getFields().map((field) => ({ name: field.name })),\n distinctRows: dataObject.getParameter(\"distinctRows\"),\n filterObject: dataObject.getParameter(\"filterObject\"),\n filterString: dataObject.getParameter(\"filterString\"),\n maxRecords: dataObject.getParameter(\"maxRecords\"),\n sortOrder: dataObject.getParameter(\"sortOrder\"),\n whereClause: dataObject.getParameter(\"whereClause\"),\n whereObject: dataObject.getParameter(\"whereObject\"),\n ...specifiedOptions,\n };\n}\n\nconst defaultOptions: DataExportOptions = {\n columns: [],\n distinctRows: false,\n filterObject: null,\n filterString: \"\",\n maxRecords: -1,\n sortOrder: [],\n whereClause: \"\",\n whereObject: null,\n};\n\n/**\n * Get a request object to download a report from a data object.\n * @param params Parameters to use to create a report\n * @returns Request object for the report\n */\nexport function getDataObjectReportRequest(params: DataObjectReportParams) {\n const { articleId, dataObject, format, options } = params;\n const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;\n const body = \"data=\" + encodeURIComponent(JSON.stringify(reportOptions));\n const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;\n\n const controller = params.controller ?? new AbortController();\n\n return {\n controller,\n request: new Request(requestUrl, {\n body,\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n signal: controller.signal,\n }),\n };\n}\n\nexport function openDataObjectReport(params: DataObjectReportParams) {\n const { dataObject, fileName, format } = params;\n const { request } = getDataObjectReportRequest(params);\n\n return downloadRequest(request, {\n fileName: `${fileName || dataObject}.${format}`,\n });\n}\n", "export default function has(\n obj: any,\n key: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "const funcRegex = /^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 default function parseFunc(func: Function) {\n var match = func.toString().match(funcRegex);\n if (match === null) {\n throw new TypeError(\"Unable to parse function!\");\n }\n return { 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 default function requireNamespace(\n root: any,\n namespace: string | Array<string>\n): any {\n if (typeof root === \"object\") {\n if (typeof namespace === \"string\") {\n let path = namespace.split(\".\");\n\n return requireNamespace(root, path);\n } else if (Array.isArray(namespace)) {\n let current: any = root;\n for (let i = 0; i < namespace.length; i++) {\n current = current[namespace[i]] =\n current[namespace[i]] || new (Namespace as any)();\n }\n\n return current;\n } else {\n throw new TypeError(\"Invalid type of parameter 'namespace'\");\n }\n } else {\n throw new TypeError(\"Invalid type of parameter 'root'\");\n }\n}\n", "/* eslint-disable no-console */\nexport default function warn(message: string, fallbackToAlert?: boolean) {\n console.warn(message);\n}\n", "import has from \"./has.js\";\nimport parseFunc from \"./parseFunc.js\";\nimport requireNamespace from \"./requireNamespace.js\";\nimport warn from \"./warn.js\";\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 default function expose(\n name: object | string,\n value: object | Function | Function[]\n): void {\n if (arguments.length !== 2) {\n throw new Error(\n \"Incorrect number of arguments passed to the expose function!\"\n );\n }\n\n if (Array.isArray(value)) {\n for (let func of value) {\n const { name: funcName } = parseFunc(func);\n\n if (funcName) {\n expose(name, func); // Expose func on namespace found in pName\n } else {\n throw new Error(\n \"Unable to detect name of function! Name it, or only supply one function and include name in first parameter.\"\n );\n }\n }\n } else {\n let keyName: string | undefined;\n let namespace;\n\n if (typeof value === \"function\") {\n keyName = parseFunc(value).name;\n }\n\n if (typeof name === \"string\") {\n let pathParts = name.split(\".\");\n\n if (!keyName) {\n keyName = pathParts[pathParts.length - 1];\n pathParts = pathParts.slice(0, pathParts.length - 1);\n }\n\n namespace = requireNamespace(window, pathParts);\n } else if (\n keyName &&\n (typeof name === \"object\" || typeof name === \"function\")\n ) {\n namespace = name;\n } else {\n throw new TypeError(\n \"Invalid typeof parameter 'name', or unable to parse pValue!\"\n );\n }\n\n if (has(namespace, keyName)) {\n // If class is already defined, warn or show an alert\n warn([name, keyName].join(\".\") + \" is already defined!\");\n } else {\n namespace[keyName] = value;\n }\n }\n}\n", "async function getLocalizedStringAsync(string: string) {\n try {\n let response = await fetch(\"/api/user/localize\", {\n body: JSON.stringify({ string }),\n headers: {\n Accept: \"application/json; */*\",\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n method: \"POST\",\n });\n\n if (response.ok) {\n return (await response.json()) as string;\n }\n } catch (error) {}\n\n return string;\n}\n\nfunction afGetLocalizedString(string: string): string;\nfunction afGetLocalizedString(string: string, wait: false): string;\nfunction afGetLocalizedString(string: string, wait: true): Promise<string>;\nfunction afGetLocalizedString(\n string: string,\n wait?: boolean\n): string | Promise<string> {\n if (af?.article?.i18n !== undefined) {\n if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {\n af.article.i18n[string] = string;\n\n let promise = getLocalizedStringAsync(string).then((text) => {\n af.article.i18n[string] = text;\n return text;\n });\n\n if (wait) {\n return promise;\n }\n }\n\n return af.article.i18n[string];\n } else {\n return string;\n }\n}\n\ndeclare global {\n interface Window {\n __UNLOCALIZED_STRINGS__: Set<string>;\n __doNothingWithStrings?: () => Record<string, string>;\n __getUnlocalizedStrings?: (forCustomRoute?: boolean) => string;\n }\n}\n\nconst key = \"__UNLOCALIZED_STRINGS__\";\nconst localizeSet = window[key] || new Set();\n\nif (!window[key]) {\n window[key] = localizeSet;\n}\n\nfunction handleReadyStateChange() {\n if (document.readyState !== \"loading\") {\n addDeveloperUtils();\n document.removeEventListener(\"readystatechange\", handleReadyStateChange);\n }\n}\n\nif (document.readyState !== \"loading\") {\n addDeveloperUtils();\n} else {\n document.addEventListener(\"readystatechange\", handleReadyStateChange);\n}\n\nfunction isDeveloper() {\n const { af } = window;\n\n return af && af.userSession && af.userSession.isDeveloper;\n}\n\nfunction addDeveloperUtils() {\n if (isDeveloper()) {\n if (typeof window.__doNothingWithStrings === \"function\") {\n const addedStrings = window.__doNothingWithStrings();\n\n for (let string of Object.keys(addedStrings)) {\n localizeSet.add(string);\n }\n }\n\n if (!window[key]) {\n window[key] = localizeSet;\n }\n\n if (!window.__getUnlocalizedStrings) {\n window.__getUnlocalizedStrings = function (forCustomRoute) {\n const strings = [];\n\n for (let string of localizeSet) {\n if (string) {\n const escaped = string.replace(/'/g, \"\\\\'\");\n if (forCustomRoute) {\n const localized = afGetLocalizedString(string).replaceAll(\n /'/g,\n \"\\\\'\"\n );\n strings.push(`'${escaped}': '${localized}',`);\n } else {\n strings.push(\n `s['${escaped}'] = @Html(@context.AddLocalizableString(\"${string.replaceAll(\n '\"',\n '\\\\\"'\n )}\"));`\n );\n }\n }\n }\n\n if (forCustomRoute) {\n return `// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used\nif (af.userSession.uiculture === 'nb-NO') {\n\tconst strings = {\n\t\t${strings.join(\"\\n\\t\\t\")}\n\t};\n\taf.article.i18n = af.article.i18n || {};\n\tObject.assign(af.article.i18n, strings);\n}`;\n }\n\n return `<script type=\"text/javascript\">\nfunction __doNothingWithStrings() {\n@{\n\tvar context = @Appframe.Web.Context.RequestContext.Current;\n}\nlet s = {};\n${strings.join(\"\\n\")}\nreturn s;\n}\n</script>`;\n };\n }\n }\n}\n\nexport function getLocalizedString(string: string) {\n const localized = afGetLocalizedString(string);\n if (localized === string && !localizeSet.has(string)) {\n localizeSet.add(string);\n }\n\n return localized;\n}\n", "function getLocalKey(key: string): string {\n return [af?.article?.id || \"\", \"common\", key].join(\".\");\n}\n\nclass LocalStorage {\n isPersisted() {\n return true;\n }\n\n getLocalStorageKey(key: string, global?: boolean) {\n return global ? [\"common\", key].join(\".\") : getLocalKey(key);\n }\n\n get(key: string, defaultValue: unknown, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n const value = localStorage.getItem(lsKey);\n\n return value !== null ? JSON.parse(value) : defaultValue;\n }\n\n set(key: string, value: unknown, global?: boolean) {\n localStorage.setItem(\n this.getLocalStorageKey(key, global),\n JSON.stringify(value)\n );\n }\n\n remove(key: string, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n if (localStorage.getItem(lsKey) !== null) {\n localStorage.removeItem(lsKey);\n return true;\n } else {\n return false;\n }\n }\n\n clear() {\n const baseKey = getLocalKey(\"\");\n\n for (let key in localStorage) {\n if (key.slice(0, baseKey.length) === baseKey) {\n localStorage.removeItem(key);\n }\n }\n }\n}\n\nexport default new LocalStorage();\n", "import mitt, { Emitter, Handler } from \"mitt\";\nimport { getLocalizedString } from \"./getLocalizedString.js\";\n\ntype SessionHandlerEvent = \"onExpired\" | \"onAuthenticated\";\n\nexport default class SessionHandler {\n static messages = {\n login: \"Log in\",\n relog: \"Session expired - log in\"\n };\n\n private eventHandler: Emitter<{ onAuthenticated: void; onExpired: void }> = mitt();\n private showingDialog = false;\n private dialog = null;\n\n expired(callback: Function) {\n af.userSession = af.userSession || {\n login: null\n };\n\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Parameter pCallback passed to the expired function must be a function!\");\n }\n\n const once = () => {\n this.detachEvent(\"onAuthenticated\", once);\n callback();\n };\n\n this.attachEvent(\"onAuthenticated\", once);\n\n if (this.showingDialog !== true) {\n this.showingDialog = true;\n const contentContainer = document.createElement(\"div\");\n contentContainer.className = \"session-expired-container\";\n contentContainer.innerHTML = `\n<div class=\"session-expired-log-in\" style=\"margin-top: 20px;\">\n <div class=\"row\">\n <div class=\"sessionExpired\">\n <h4 class=\"message\">Frakoblet - tidsavbrudd</h4>\n <div class=\"form-group\">\n <label for=\"username\">${getLocalizedString(\"Username\")}</label>\n <input type=\"text\" class=\"form-control\" id=\"username\" autofocus>\n </div>\n <div class=\"form-group\">\n <label for=\"password\">${getLocalizedString(\"Password\")}</label>\n <input type=\"password\" autocomplete=\"password\" class=\"form-control\" id=\"password\" >\n </div>\n <div class=\"form-group\">\n <div>\n <button type=\"submit\" class=\"btn btn-default sign-in\">\n ${getLocalizedString(\"Log in\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"\" style=\"display:none; margin: 0px 30px;\">\n <div class=\"alert alert-warning\" role=\"alert\" style=\"margin-top:10px;\"></div> \n </div>\n </div>\n</div>\n`;\n const message = af.userSession.login ? SessionHandler.messages.relog : SessionHandler.messages.login;\n\n const messageElem = contentContainer.querySelector(\".message\") as HTMLHeadingElement;\n const statusElem = contentContainer.querySelector(\".alert-warning\") as HTMLDivElement;\n const userElem = contentContainer.querySelector(\"input[type=text]\") as HTMLInputElement;\n const signInElem = contentContainer.querySelector(\".sign-in\") as HTMLButtonElement;\n const passwordElem = contentContainer.querySelector(\"input[type=password]\") as HTMLInputElement;\n\n if (\n messageElem !== null &&\n userElem !== null &&\n statusElem !== null &&\n userElem !== null &&\n signInElem !== null &&\n passwordElem !== null\n ) {\n messageElem.innerText = getLocalizedString(message);\n\n userElem.value = af.userSession.login || \"\";\n userElem.disabled = !!af.userSession.login;\n userElem.readOnly = !!af.userSession.login;\n\n document.body.appendChild(contentContainer);\n\n const doLogin = async () => {\n passwordElem.disabled = true;\n\n const request = new Request(\"/login\", {\n body: JSON.stringify({\n username: userElem.value,\n password: passwordElem.value,\n remember: false\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n method: \"POST\"\n });\n\n try {\n const response = await fetch(request);\n const json = await response.json();\n\n if (json.success) {\n document.body.removeChild(contentContainer);\n this.showingDialog = false;\n this.eventHandler.emit(\"onAuthenticated\");\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"none\";\n }\n } else {\n throw new Error(json.error);\n }\n } catch (err) {\n if (err && typeof err === \"object\") {\n let error = err as Error;\n passwordElem.disabled = false;\n passwordElem.classList.toggle(\"invalid\", true);\n passwordElem.value = \"\";\n passwordElem.focus();\n statusElem.innerText = error.message ? error.message : String(error);\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"initial\";\n }\n }\n }\n };\n\n signInElem.addEventListener(\"click\", doLogin);\n\n passwordElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.focus();\n }\n }\n }\n\n attachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.on(eventName, handler);\n }\n\n detachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.off(eventName, handler);\n }\n}\n", "import SessionHandler from \"./SessionHandler.js\";\n\nexport default class UserSession extends SessionHandler {\n decimalSeparator: string = \".\";\n formats: any;\n groupSeparator: string | null = null;\n shortDateFormat: string = \"dd.MM.yyyy\";\n login: string | null = null;\n isDeveloper: boolean = false;\n\n constructor(userData: any) {\n super();\n this.formats = {};\n Object.assign(this, userData);\n }\n}\n", "import type { DataObject, Procedure } from \"@olenbetong/appframe-data\";\n\nfunction getFormValue(value: string, type: string): string | number | boolean | Date | BigInt | null | undefined {\n if (value === \"\") {\n return null;\n } else if (type === \"number\") {\n let numValue = Number(value);\n\n return isNaN(numValue) ? undefined : numValue;\n } else if ([\"date\", \"datetime\", \"time\"].includes(type)) {\n let dateValue = new Date(value);\n\n return isNaN(dateValue.getTime()) ? undefined : dateValue;\n } else if (type === \"boolean\") {\n return value.toLowerCase() === \"true\";\n } else if (type === \"bigint\") {\n return BigInt(value);\n }\n\n return value;\n}\n\n/**\n * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.\n * @param form HTML form element to get form data from.\n * @param typeMap A mapping from field name to field type\n * @returns\n */\nexport function formDataToObject<T = any>(form: HTMLFormElement, typeMap: Record<string, string> = {}): Partial<T> {\n let formData = new FormData(form);\n let result: any = {};\n\n for (let entry of formData.entries()) {\n let field = entry[0];\n let type = typeMap?.[field] ?? \"string\";\n let value = getFormValue(entry[1] as string, type);\n\n if (result.hasOwnProperty(field)) {\n if (Array.isArray(result[field])) {\n result[field].push(value);\n } else {\n result[field] = [result[field], value];\n }\n } else {\n result[field] = value;\n }\n }\n\n return result as T;\n}\n\n/**\n * Creates a partial data object record from form data. The name property is mapped\n * to field name.\n *\n * @param form HTML form element to get FormData from\n * @param dataObject Data object for which to create a record from the form data\n * @returns {Partial<T>} Partial data object record\n */\nexport function formDataToDataObjectRecord<T>(form: HTMLFormElement, dataObject: DataObject<T>): Partial<T> {\n let fields = dataObject.getFields();\n let types = Object.fromEntries(fields.map((field) => [field.name, field.type])) as Record<string, string>;\n\n return formDataToObject<T>(form, types);\n}\n\n/**\n * Creates procedure parameters from form data. The name property is mapped\n * to parameter names.\n *\n * @param form HTML Form element to get FormData from\n * @param procedure Appframe Procedure to create parameters for\n * @returns\n */\nexport function formDataToProcedureParameters<T>(form: HTMLFormElement, procedure: Procedure<T, any>): T {\n let parameters = procedure.getParameters();\n let types = Object.fromEntries(parameters.map((param) => [param.name, param.type])) as Record<string, string>;\n\n return formDataToObject(form, types) as T;\n}\n", "function getKey(article?: string) {\n const articleKey = article || af.article.id;\n return `${articleKey}.${af.userSession.login}`;\n}\n\nexport function getSettings<T>(setting: string, article?: string): T | null {\n if (!af?.userSession) return null;\n\n const key = getKey(article);\n const settings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (setting) {\n return settings[setting] || null;\n }\n\n return settings;\n}\n\nexport function saveSettings<T>(\n setting: string,\n value: T | null,\n article?: string\n): void {\n if (!af?.userSession) return;\n\n const key = getKey(article);\n let userSettings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (typeof value !== \"undefined\") {\n userSettings[setting] = value;\n } else {\n userSettings = setting;\n }\n\n localStorage.setItem(key, JSON.stringify(userSettings));\n}\n"],
5
- "mappings": "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",
6
- "names": ["src_exports", "__export", "SessionHandler", "UserSession", "downloadBlob", "downloadRequest", "exportOptionsFromDataObject", "expose", "formDataToDataObjectRecord", "formDataToObject", "formDataToProcedureParameters", "getDataObjectReportRequest", "getLocalizedString", "getSettings", "localStorage_default", "mitt_default", "openDataObjectReport", "saveSettings", "version", "all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "downloadBlob", "blob", "fileName", "resolve", "reject", "url", "parent", "anchor", "ex", "downloadRequest", "request", "fileName", "controller", "onProgress", "_a", "_b", "reportProgress", "progress", "__spreadValues", "bytesReceived", "response", "data", "reader", "stream", "pump", "read", "error", "blob", "downloadBlob", "err", "exportOptionsFromDataObject", "dataObject", "specifiedOptions", "__spreadValues", "field", "defaultOptions", "getDataObjectReportRequest", "params", "_a", "articleId", "format", "options", "reportOptions", "body", "requestUrl", "controller", "openDataObjectReport", "fileName", "request", "downloadRequest", "has", "obj", "key", "funcRegex", "parseFunc", "func", "match", "Namespace", "Namespace_default", "requireNamespace", "root", "namespace", "path", "current", "i", "Namespace_default", "warn", "message", "fallbackToAlert", "expose", "name", "value", "func", "funcName", "parseFunc", "keyName", "namespace", "pathParts", "requireNamespace", "has", "warn", "getLocalizedStringAsync", "string", "response", "error", "afGetLocalizedString", "wait", "_a", "promise", "text", "key", "localizeSet", "handleReadyStateChange", "addDeveloperUtils", "isDeveloper", "af", "addedStrings", "forCustomRoute", "strings", "escaped", "localized", "getLocalizedString", "getLocalKey", "key", "_a", "LocalStorage", "global", "defaultValue", "lsKey", "value", "baseKey", "localStorage_default", "_SessionHandler", "mitt_default", "callback", "once", "contentContainer", "getLocalizedString", "message", "messageElem", "statusElem", "userElem", "signInElem", "passwordElem", "doLogin", "request", "json", "err", "error", "evt", "eventName", "handler", "SessionHandler", "UserSession", "SessionHandler", "userData", "getFormValue", "value", "type", "numValue", "dateValue", "formDataToObject", "form", "typeMap", "_a", "formData", "result", "entry", "field", "formDataToDataObjectRecord", "dataObject", "fields", "types", "formDataToProcedureParameters", "procedure", "parameters", "param", "getKey", "article", "getSettings", "setting", "key", "settings", "saveSettings", "value", "userSettings", "version"]
3
+ "sources": ["../../src/index.ts", "../../src/errorHandler.ts", "../../../../node_modules/mitt/src/index.ts", "../../src/downloadBlob.ts", "../../src/downloadRequest.ts", "../../src/exportDataObject.ts", "../../src/has.ts", "../../src/parseFunc.ts", "../../src/Namespace.ts", "../../src/requireNamespace.ts", "../../src/warn.ts", "../../src/expose.ts", "../../src/getLocalizedString.ts", "../../src/localStorage.ts", "../../src/SessionHandler.ts", "../../src/UserSession.ts", "../../src/formDataToObject.ts", "../../src/settings.ts"],
4
+ "sourcesContent": ["import \"./errorHandler.js\";\n\nexport { default as mitt } from \"mitt\";\nexport { downloadBlob } from \"./downloadBlob.js\";\nexport * from \"./downloadRequest.js\";\nexport * from \"./exportDataObject.js\";\nexport { default as expose } from \"./expose.js\";\nexport { getLocalizedString } from \"./getLocalizedString.js\";\nexport * from \"./has.js\";\nexport { default as localStorage } from \"./localStorage.js\";\nexport { default as SessionHandler } from \"./SessionHandler.js\";\nexport { default as UserSession } from \"./UserSession.js\";\nexport { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from \"./formDataToObject.js\";\nexport * from \"./settings.js\";\n\nexport const version = __VERSION__;\n", "window.addEventListener(\"error\", (event) => {\n try {\n // Try to avoid error-logging-loop\n const data = {\n error: event.message ?? null,\n file: event.filename,\n line: event.lineno ?? 0,\n column: event.colno ?? 0,\n stack: null,\n };\n\n fetch(\"/data/Logger/LogError\", {\n body: JSON.stringify(data),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n method: \"POST\",\n });\n } catch (ex) {\n // ignore\n }\n});\n", "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", "export function downloadBlob(blob: Blob | MediaSource, fileName: string) {\n return new Promise<void>(function (resolve, reject) {\n try {\n const url = URL.createObjectURL(blob);\n const parent = document.body;\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\"download\", fileName);\n anchor.href = url;\n parent.append(anchor);\n anchor.click();\n parent.removeChild(anchor);\n\n setTimeout(function () {\n URL.revokeObjectURL(url);\n resolve();\n }, 250);\n } catch (ex) {\n reject(ex);\n }\n });\n}\n", "import { downloadBlob } from \"./downloadBlob.js\";\n\nexport type DownloadItem = {\n status: \"cancelled\" | \"error\" | \"requested\" | \"downloading\" | \"downloaded\" | \"completed\";\n bytesReceived?: number;\n error?: string;\n};\n\nexport type DownloadParameters = {\n controller?: AbortController;\n fileName: string;\n onProgress?: (progress: DownloadItem) => void;\n};\n\nexport async function downloadRequest(request: Request, { fileName, controller, onProgress }: DownloadParameters) {\n function reportProgress(progress: DownloadItem) {\n if (typeof onProgress === \"function\") {\n onProgress({ ...progress });\n }\n }\n\n let bytesReceived = 0;\n\n reportProgress({ status: \"requested\" });\n\n try {\n let response = await fetch(request);\n\n if (!response.ok || !response.body) {\n if (response.headers.get(\"content-type\")?.includes(\"application/json\")) {\n let data = await response.json();\n if (data.error) {\n throw new Error(data.error);\n }\n }\n throw new Error(response.status + \" \" + response.statusText);\n }\n\n try {\n const reader = response.body.getReader();\n const stream = new ReadableStream({\n start: function (controller) {\n function pump(): Promise<void> {\n return reader.read().then(function (read) {\n if (read.done) {\n controller.close();\n return;\n }\n\n bytesReceived += read.value.length;\n reportProgress({ bytesReceived, status: \"downloading\" });\n controller.enqueue(read.value);\n\n return pump();\n });\n }\n\n return pump();\n },\n });\n\n response = new Response(stream);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.warn(\"Failed to replace response stream to log download progress.\");\n }\n\n const blob = await response.blob();\n\n reportProgress({ bytesReceived, status: \"downloaded\" });\n\n await downloadBlob(blob, fileName);\n\n reportProgress({ bytesReceived, status: \"completed\" });\n } catch (err) {\n if (controller?.signal?.aborted) {\n reportProgress({ status: \"cancelled\" });\n } else {\n reportProgress({ error: (err as Error).message, status: \"error\" });\n }\n }\n}\n", "import { DataObject, DataObjectOptions } from \"@olenbetong/appframe-data\";\nimport { RetrieveParameters } from \"@olenbetong/appframe-data\";\n\nimport { downloadRequest } from \"./downloadRequest.js\";\n\nexport type DataExportColumn = {\n name: string;\n caption?: string;\n cellFormat?: string;\n format?: string;\n};\n\nexport type DataExportOptions = RetrieveParameters<any> & { columns: DataExportColumn[] };\nexport type DataObjectReportParams = {\n articleId: string;\n controller?: AbortController;\n dataObject: string;\n format: \"pdf\" | \"xlsx\" | \"csv\" | \"xls\";\n fileName?: string;\n options: DataExportOptions;\n id?: string;\n title?: string;\n subTitle?: string;\n /**\n * Whether the title should be shown in the exported file (default true)\n */\n includeTitle?: boolean;\n /**\n * Whether the filter should be shown in the exported file (default true)\n */\n includefilter?: boolean;\n /**\n * Whether we should try to convert from camelCase to human readable names (default true)\n */\n formatHeaders?: boolean;\n /**\n * Whether the header should be frozen on top of the excel file.\n */\n freezeHeader?: boolean;\n};\n\n/**\n * Get columns and retrieve parameters from a data object to be used to create a report.\n * @param dataObject Data object to get parameters and columns from\n * @param specifiedOptions Options to override the data object options\n * @returns\n */\nexport function exportOptionsFromDataObject(\n dataObject: DataObject<any>,\n specifiedOptions: Partial<DataObjectOptions<any>>\n) {\n return {\n columns: dataObject.getFields().map((field) => ({ name: field.name })),\n distinctRows: dataObject.getParameter(\"distinctRows\"),\n filterObject: dataObject.getParameter(\"filterObject\"),\n filterString: dataObject.getParameter(\"filterString\"),\n maxRecords: dataObject.getParameter(\"maxRecords\"),\n sortOrder: dataObject.getParameter(\"sortOrder\"),\n whereClause: dataObject.getParameter(\"whereClause\"),\n whereObject: dataObject.getParameter(\"whereObject\"),\n ...specifiedOptions,\n };\n}\n\nconst defaultOptions: DataExportOptions = {\n columns: [],\n distinctRows: false,\n filterObject: null,\n filterString: \"\",\n maxRecords: -1,\n sortOrder: [],\n whereClause: \"\",\n whereObject: null,\n};\n\n/**\n * Get a request object to download a report from a data object.\n * @param params Parameters to use to create a report\n * @returns Request object for the report\n */\nexport function getDataObjectReportRequest(params: DataObjectReportParams) {\n const { articleId, dataObject, format, options } = params;\n const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;\n const body = \"data=\" + encodeURIComponent(JSON.stringify(reportOptions));\n const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;\n\n const controller = params.controller ?? new AbortController();\n\n return {\n controller,\n request: new Request(requestUrl, {\n body,\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n method: \"POST\",\n signal: controller.signal,\n }),\n };\n}\n\nexport function openDataObjectReport(params: DataObjectReportParams) {\n const { dataObject, fileName, format } = params;\n const { request } = getDataObjectReportRequest(params);\n\n return downloadRequest(request, {\n fileName: `${fileName || dataObject}.${format}`,\n });\n}\n", "export default function has(\n obj: any,\n key: string | number | symbol\n): boolean {\n return Object.prototype.hasOwnProperty.call(obj, key);\n}\n", "const funcRegex = /^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 default function parseFunc(func: Function) {\n var match = func.toString().match(funcRegex);\n if (match === null) {\n throw new TypeError(\"Unable to parse function!\");\n }\n return { 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 default function requireNamespace(\n root: any,\n namespace: string | Array<string>\n): any {\n if (typeof root === \"object\") {\n if (typeof namespace === \"string\") {\n let path = namespace.split(\".\");\n\n return requireNamespace(root, path);\n } else if (Array.isArray(namespace)) {\n let current: any = root;\n for (let i = 0; i < namespace.length; i++) {\n current = current[namespace[i]] =\n current[namespace[i]] || new (Namespace as any)();\n }\n\n return current;\n } else {\n throw new TypeError(\"Invalid type of parameter 'namespace'\");\n }\n } else {\n throw new TypeError(\"Invalid type of parameter 'root'\");\n }\n}\n", "/* eslint-disable no-console */\nexport default function warn(message: string, fallbackToAlert?: boolean) {\n console.warn(message);\n}\n", "import has from \"./has.js\";\nimport parseFunc from \"./parseFunc.js\";\nimport requireNamespace from \"./requireNamespace.js\";\nimport warn from \"./warn.js\";\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 default function expose(\n name: object | string,\n value: object | Function | Function[]\n): void {\n if (arguments.length !== 2) {\n throw new Error(\n \"Incorrect number of arguments passed to the expose function!\"\n );\n }\n\n if (Array.isArray(value)) {\n for (let func of value) {\n const { name: funcName } = parseFunc(func);\n\n if (funcName) {\n expose(name, func); // Expose func on namespace found in pName\n } else {\n throw new Error(\n \"Unable to detect name of function! Name it, or only supply one function and include name in first parameter.\"\n );\n }\n }\n } else {\n let keyName: string | undefined;\n let namespace;\n\n if (typeof value === \"function\") {\n keyName = parseFunc(value).name;\n }\n\n if (typeof name === \"string\") {\n let pathParts = name.split(\".\");\n\n if (!keyName) {\n keyName = pathParts[pathParts.length - 1];\n pathParts = pathParts.slice(0, pathParts.length - 1);\n }\n\n namespace = requireNamespace(window, pathParts);\n } else if (\n keyName &&\n (typeof name === \"object\" || typeof name === \"function\")\n ) {\n namespace = name;\n } else {\n throw new TypeError(\n \"Invalid typeof parameter 'name', or unable to parse pValue!\"\n );\n }\n\n if (has(namespace, keyName)) {\n // If class is already defined, warn or show an alert\n warn([name, keyName].join(\".\") + \" is already defined!\");\n } else {\n namespace[keyName] = value;\n }\n }\n}\n", "async function getLocalizedStringAsync(string: string) {\n try {\n let response = await fetch(\"/api/user/localize\", {\n body: JSON.stringify({ string }),\n headers: {\n Accept: \"application/json; */*\",\n \"Content-Type\": \"application/json\",\n \"X-Requested-With\": \"XMLHttpRequest\",\n },\n method: \"POST\",\n });\n\n if (response.ok) {\n return (await response.json()) as string;\n }\n } catch (error) {}\n\n return string;\n}\n\nfunction afGetLocalizedString(string: string): string;\nfunction afGetLocalizedString(string: string, wait: false): string;\nfunction afGetLocalizedString(string: string, wait: true): Promise<string>;\nfunction afGetLocalizedString(\n string: string,\n wait?: boolean\n): string | Promise<string> {\n if (af?.article?.i18n !== undefined) {\n if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {\n af.article.i18n[string] = string;\n\n let promise = getLocalizedStringAsync(string).then((text) => {\n af.article.i18n[string] = text;\n return text;\n });\n\n if (wait) {\n return promise;\n }\n }\n\n return af.article.i18n[string];\n } else {\n return string;\n }\n}\n\ndeclare global {\n interface Window {\n __UNLOCALIZED_STRINGS__: Set<string>;\n __doNothingWithStrings?: () => Record<string, string>;\n __getUnlocalizedStrings?: (forCustomRoute?: boolean) => string;\n }\n}\n\nconst key = \"__UNLOCALIZED_STRINGS__\";\nconst localizeSet = window[key] || new Set();\n\nif (!window[key]) {\n window[key] = localizeSet;\n}\n\nfunction handleReadyStateChange() {\n if (document.readyState !== \"loading\") {\n addDeveloperUtils();\n document.removeEventListener(\"readystatechange\", handleReadyStateChange);\n }\n}\n\nif (document.readyState !== \"loading\") {\n addDeveloperUtils();\n} else {\n document.addEventListener(\"readystatechange\", handleReadyStateChange);\n}\n\nfunction isDeveloper() {\n const { af } = window;\n\n return af && af.userSession && af.userSession.isDeveloper;\n}\n\nfunction addDeveloperUtils() {\n if (isDeveloper()) {\n if (typeof window.__doNothingWithStrings === \"function\") {\n const addedStrings = window.__doNothingWithStrings();\n\n for (let string of Object.keys(addedStrings)) {\n localizeSet.add(string);\n }\n }\n\n if (!window[key]) {\n window[key] = localizeSet;\n }\n\n if (!window.__getUnlocalizedStrings) {\n window.__getUnlocalizedStrings = function (forCustomRoute) {\n const strings = [];\n\n for (let string of localizeSet) {\n if (string) {\n const escaped = string.replace(/'/g, \"\\\\'\");\n if (forCustomRoute) {\n const localized = afGetLocalizedString(string).replaceAll(\n /'/g,\n \"\\\\'\"\n );\n strings.push(`'${escaped}': '${localized}',`);\n } else {\n strings.push(\n `s['${escaped}'] = @Html(@context.AddLocalizableString(\"${string.replaceAll(\n '\"',\n '\\\\\"'\n )}\"));`\n );\n }\n }\n }\n\n if (forCustomRoute) {\n return `// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used\nif (af.userSession.uiculture === 'nb-NO') {\n\tconst strings = {\n\t\t${strings.join(\"\\n\\t\\t\")}\n\t};\n\taf.article.i18n = af.article.i18n || {};\n\tObject.assign(af.article.i18n, strings);\n}`;\n }\n\n return `<script type=\"text/javascript\">\nfunction __doNothingWithStrings() {\n@{\n\tvar context = @Appframe.Web.Context.RequestContext.Current;\n}\nlet s = {};\n${strings.join(\"\\n\")}\nreturn s;\n}\n</script>`;\n };\n }\n }\n}\n\nexport function getLocalizedString(string: string) {\n const localized = afGetLocalizedString(string);\n if (localized === string && !localizeSet.has(string)) {\n localizeSet.add(string);\n }\n\n return localized;\n}\n", "function getLocalKey(key: string): string {\n return [af?.article?.id || \"\", \"common\", key].join(\".\");\n}\n\nclass LocalStorage {\n isPersisted() {\n return true;\n }\n\n getLocalStorageKey(key: string, global?: boolean) {\n return global ? [\"common\", key].join(\".\") : getLocalKey(key);\n }\n\n get(key: string, defaultValue: unknown, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n const value = localStorage.getItem(lsKey);\n\n return value !== null ? JSON.parse(value) : defaultValue;\n }\n\n set(key: string, value: unknown, global?: boolean) {\n localStorage.setItem(\n this.getLocalStorageKey(key, global),\n JSON.stringify(value)\n );\n }\n\n remove(key: string, global?: boolean) {\n const lsKey = this.getLocalStorageKey(key, global);\n if (localStorage.getItem(lsKey) !== null) {\n localStorage.removeItem(lsKey);\n return true;\n } else {\n return false;\n }\n }\n\n clear() {\n const baseKey = getLocalKey(\"\");\n\n for (let key in localStorage) {\n if (key.slice(0, baseKey.length) === baseKey) {\n localStorage.removeItem(key);\n }\n }\n }\n}\n\nexport default new LocalStorage();\n", "import mitt, { Emitter, Handler } from \"mitt\";\nimport { getLocalizedString } from \"./getLocalizedString.js\";\n\ntype SessionHandlerEvent = \"onExpired\" | \"onAuthenticated\";\n\nexport default class SessionHandler {\n static messages = {\n login: \"Log in\",\n relog: \"Session expired - log in\"\n };\n\n private eventHandler: Emitter<{ onAuthenticated: void; onExpired: void }> = mitt();\n private showingDialog = false;\n private dialog = null;\n\n expired(callback: Function) {\n af.userSession = af.userSession || {\n login: null\n };\n\n if (typeof callback !== \"function\") {\n throw new TypeError(\"Parameter pCallback passed to the expired function must be a function!\");\n }\n\n const once = () => {\n this.detachEvent(\"onAuthenticated\", once);\n callback();\n };\n\n this.attachEvent(\"onAuthenticated\", once);\n\n if (this.showingDialog !== true) {\n this.showingDialog = true;\n const contentContainer = document.createElement(\"div\");\n contentContainer.className = \"session-expired-container\";\n contentContainer.innerHTML = `\n<div class=\"session-expired-log-in\" style=\"margin-top: 20px;\">\n <div class=\"row\">\n <div class=\"sessionExpired\">\n <h4 class=\"message\">Frakoblet - tidsavbrudd</h4>\n <div class=\"form-group\">\n <label for=\"username\">${getLocalizedString(\"Username\")}</label>\n <input type=\"text\" class=\"form-control\" id=\"username\" autofocus>\n </div>\n <div class=\"form-group\">\n <label for=\"password\">${getLocalizedString(\"Password\")}</label>\n <input type=\"password\" autocomplete=\"password\" class=\"form-control\" id=\"password\" >\n </div>\n <div class=\"form-group\">\n <div>\n <button type=\"submit\" class=\"btn btn-default sign-in\">\n ${getLocalizedString(\"Log in\")}\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"\" style=\"display:none; margin: 0px 30px;\">\n <div class=\"alert alert-warning\" role=\"alert\" style=\"margin-top:10px;\"></div> \n </div>\n </div>\n</div>\n`;\n const message = af.userSession.login ? SessionHandler.messages.relog : SessionHandler.messages.login;\n\n const messageElem = contentContainer.querySelector(\".message\") as HTMLHeadingElement;\n const statusElem = contentContainer.querySelector(\".alert-warning\") as HTMLDivElement;\n const userElem = contentContainer.querySelector(\"input[type=text]\") as HTMLInputElement;\n const signInElem = contentContainer.querySelector(\".sign-in\") as HTMLButtonElement;\n const passwordElem = contentContainer.querySelector(\"input[type=password]\") as HTMLInputElement;\n\n if (\n messageElem !== null &&\n userElem !== null &&\n statusElem !== null &&\n userElem !== null &&\n signInElem !== null &&\n passwordElem !== null\n ) {\n messageElem.innerText = getLocalizedString(message);\n\n userElem.value = af.userSession.login || \"\";\n userElem.disabled = !!af.userSession.login;\n userElem.readOnly = !!af.userSession.login;\n\n document.body.appendChild(contentContainer);\n\n const doLogin = async () => {\n passwordElem.disabled = true;\n\n const request = new Request(\"/login\", {\n body: JSON.stringify({\n username: userElem.value,\n password: passwordElem.value,\n remember: false\n }),\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"X-Requested-With\": \"XMLHttpRequest\"\n },\n method: \"POST\"\n });\n\n try {\n const response = await fetch(request);\n const json = await response.json();\n\n if (json.success) {\n document.body.removeChild(contentContainer);\n this.showingDialog = false;\n this.eventHandler.emit(\"onAuthenticated\");\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"none\";\n }\n } else {\n throw new Error(json.error);\n }\n } catch (err) {\n if (err && typeof err === \"object\") {\n let error = err as Error;\n passwordElem.disabled = false;\n passwordElem.classList.toggle(\"invalid\", true);\n passwordElem.value = \"\";\n passwordElem.focus();\n statusElem.innerText = error.message ? error.message : String(error);\n\n if (statusElem.parentNode) {\n (statusElem.parentNode as HTMLElement).style.display = \"initial\";\n }\n }\n }\n };\n\n signInElem.addEventListener(\"click\", doLogin);\n\n passwordElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"keyup\", evt => {\n if (evt.key === \"Enter\") {\n doLogin();\n }\n });\n\n userElem.addEventListener(\"change\", evt => {\n if ((evt as KeyboardEvent).key === \"Enter\") {\n doLogin();\n }\n });\n\n passwordElem.focus();\n }\n }\n }\n\n attachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.on(eventName, handler);\n }\n\n detachEvent(eventName: SessionHandlerEvent, handler: Handler) {\n return this.eventHandler.off(eventName, handler);\n }\n}\n", "import SessionHandler from \"./SessionHandler.js\";\n\nexport default class UserSession extends SessionHandler {\n decimalSeparator: string = \".\";\n formats: any;\n groupSeparator: string | null = null;\n shortDateFormat: string = \"dd.MM.yyyy\";\n login: string | null = null;\n isDeveloper: boolean = false;\n\n constructor(userData: any) {\n super();\n this.formats = {};\n Object.assign(this, userData);\n }\n}\n", "import type { DataObject, Procedure } from \"@olenbetong/appframe-data\";\n\nfunction getFormValue(value: string, type: string): string | number | boolean | Date | BigInt | null | undefined {\n if (value === \"\") {\n return null;\n } else if (type === \"number\") {\n let numValue = Number(value);\n\n return isNaN(numValue) ? undefined : numValue;\n } else if ([\"date\", \"datetime\", \"time\"].includes(type)) {\n let dateValue = new Date(value);\n\n return isNaN(dateValue.getTime()) ? undefined : dateValue;\n } else if (type === \"boolean\") {\n return value.toLowerCase() === \"true\";\n } else if (type === \"bigint\") {\n return BigInt(value);\n }\n\n return value;\n}\n\n/**\n * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.\n * @param form HTML form element to get form data from.\n * @param typeMap A mapping from field name to field type\n * @returns\n */\nexport function formDataToObject<T = any>(form: HTMLFormElement, typeMap: Record<string, string> = {}): Partial<T> {\n let formData = new FormData(form);\n let result: any = {};\n\n for (let entry of formData.entries()) {\n let field = entry[0];\n let type = typeMap?.[field] ?? \"string\";\n let value = getFormValue(entry[1] as string, type);\n\n if (result.hasOwnProperty(field)) {\n if (Array.isArray(result[field])) {\n result[field].push(value);\n } else {\n result[field] = [result[field], value];\n }\n } else {\n result[field] = value;\n }\n }\n\n return result as T;\n}\n\n/**\n * Creates a partial data object record from form data. The name property is mapped\n * to field name.\n *\n * @param form HTML form element to get FormData from\n * @param dataObject Data object for which to create a record from the form data\n * @returns {Partial<T>} Partial data object record\n */\nexport function formDataToDataObjectRecord<T>(form: HTMLFormElement, dataObject: DataObject<T>): Partial<T> {\n let fields = dataObject.getFields();\n let types = Object.fromEntries(fields.map((field) => [field.name, field.type])) as Record<string, string>;\n\n return formDataToObject<T>(form, types);\n}\n\n/**\n * Creates procedure parameters from form data. The name property is mapped\n * to parameter names.\n *\n * @param form HTML Form element to get FormData from\n * @param procedure Appframe Procedure to create parameters for\n * @returns\n */\nexport function formDataToProcedureParameters<T>(form: HTMLFormElement, procedure: Procedure<T, any>): T {\n let parameters = procedure.getParameters();\n let types = Object.fromEntries(parameters.map((param) => [param.name, param.type])) as Record<string, string>;\n\n return formDataToObject(form, types) as T;\n}\n", "function getKey(article?: string) {\n const articleKey = article || af.article.id;\n return `${articleKey}.${af.userSession.login}`;\n}\n\nexport function getSettings<T>(setting: string, article?: string): T | null {\n if (!af?.userSession) return null;\n\n const key = getKey(article);\n const settings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (setting) {\n return settings[setting] || null;\n }\n\n return settings;\n}\n\nexport function saveSettings<T>(\n setting: string,\n value: T | null,\n article?: string\n): void {\n if (!af?.userSession) return;\n\n const key = getKey(article);\n let userSettings = JSON.parse(localStorage.getItem(key) || \"{}\");\n\n if (typeof value !== \"undefined\") {\n userSettings[setting] = value;\n } else {\n userSettings = setting;\n }\n\n localStorage.setItem(key, JSON.stringify(userSettings));\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["src_exports", "__export", "SessionHandler", "UserSession", "downloadBlob", "downloadRequest", "exportOptionsFromDataObject", "expose", "formDataToDataObjectRecord", "formDataToObject", "formDataToProcedureParameters", "getDataObjectReportRequest", "getLocalizedString", "getSettings", "localStorage_default", "mitt_default", "openDataObjectReport", "saveSettings", "version", "event", "data", "all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "downloadBlob", "blob", "fileName", "resolve", "reject", "url", "parent", "anchor", "ex", "downloadRequest", "request", "fileName", "controller", "onProgress", "reportProgress", "progress", "bytesReceived", "response", "data", "reader", "stream", "pump", "read", "blob", "downloadBlob", "err", "exportOptionsFromDataObject", "dataObject", "specifiedOptions", "field", "defaultOptions", "getDataObjectReportRequest", "params", "articleId", "format", "options", "reportOptions", "body", "requestUrl", "controller", "openDataObjectReport", "fileName", "request", "downloadRequest", "has", "obj", "key", "funcRegex", "parseFunc", "func", "match", "Namespace", "Namespace_default", "requireNamespace", "root", "namespace", "path", "current", "i", "Namespace_default", "warn", "message", "fallbackToAlert", "expose", "name", "value", "func", "funcName", "parseFunc", "keyName", "namespace", "pathParts", "requireNamespace", "has", "warn", "getLocalizedStringAsync", "string", "response", "afGetLocalizedString", "wait", "promise", "text", "key", "localizeSet", "handleReadyStateChange", "addDeveloperUtils", "isDeveloper", "af", "addedStrings", "forCustomRoute", "strings", "escaped", "localized", "getLocalizedString", "getLocalKey", "key", "LocalStorage", "global", "defaultValue", "lsKey", "value", "baseKey", "localStorage_default", "_SessionHandler", "mitt_default", "callback", "once", "contentContainer", "getLocalizedString", "message", "messageElem", "statusElem", "userElem", "signInElem", "passwordElem", "doLogin", "request", "json", "err", "error", "evt", "eventName", "handler", "SessionHandler", "UserSession", "SessionHandler", "userData", "getFormValue", "value", "type", "numValue", "dateValue", "formDataToObject", "form", "typeMap", "formData", "result", "entry", "field", "formDataToDataObjectRecord", "dataObject", "fields", "types", "formDataToProcedureParameters", "procedure", "parameters", "param", "getKey", "article", "getSettings", "setting", "key", "settings", "saveSettings", "value", "userSettings", "version"]
7
7
  }
File without changes
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ window.addEventListener("error", (event) => {
3
+ try {
4
+ // Try to avoid error-logging-loop
5
+ const data = {
6
+ error: event.message ?? null,
7
+ file: event.filename,
8
+ line: event.lineno ?? 0,
9
+ column: event.colno ?? 0,
10
+ stack: null,
11
+ };
12
+ fetch("/data/Logger/LogError", {
13
+ body: JSON.stringify(data),
14
+ headers: {
15
+ Accept: "application/json",
16
+ "Content-Type": "application/json; charset=utf-8",
17
+ "X-Requested-With": "XMLHttpRequest",
18
+ },
19
+ method: "POST",
20
+ });
21
+ }
22
+ catch (ex) {
23
+ // ignore
24
+ }
25
+ });
package/es/index.d.ts CHANGED
@@ -1,9 +1,11 @@
1
+ import "./errorHandler.js";
1
2
  export { default as mitt } from "mitt";
2
3
  export { downloadBlob } from "./downloadBlob.js";
3
4
  export * from "./downloadRequest.js";
4
5
  export * from "./exportDataObject.js";
5
6
  export { default as expose } from "./expose.js";
6
7
  export { getLocalizedString } from "./getLocalizedString.js";
8
+ export * from "./has.js";
7
9
  export { default as localStorage } from "./localStorage.js";
8
10
  export { default as SessionHandler } from "./SessionHandler.js";
9
11
  export { default as UserSession } from "./UserSession.js";
package/es/index.js CHANGED
@@ -1,12 +1,14 @@
1
+ import "./errorHandler.js";
1
2
  export { default as mitt } from "mitt";
2
3
  export { downloadBlob } from "./downloadBlob.js";
3
4
  export * from "./downloadRequest.js";
4
5
  export * from "./exportDataObject.js";
5
6
  export { default as expose } from "./expose.js";
6
7
  export { getLocalizedString } from "./getLocalizedString.js";
8
+ export * from "./has.js";
7
9
  export { default as localStorage } from "./localStorage.js";
8
10
  export { default as SessionHandler } from "./SessionHandler.js";
9
11
  export { default as UserSession } from "./UserSession.js";
10
12
  export { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from "./formDataToObject.js";
11
13
  export * from "./settings.js";
12
- export const version = "1.2.3";
14
+ export const version = "1.3.0";
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@olenbetong/appframe-core",
3
- "version": "1.2.3",
3
+ "version": "1.3.0",
4
4
  "description": "Javascript libraries to utilize the Appframe framework",
5
5
  "type": "module",
6
+ "sideEffects": [
7
+ "/src/errorHandler.ts"
8
+ ],
6
9
  "main": "./es/index.js",
7
10
  "exports": {
8
11
  ".": {
@@ -40,5 +43,5 @@
40
43
  "devDependencies": {
41
44
  "chalk": "^5.0.1"
42
45
  },
43
- "gitHead": "a8197305a09e60e98ce5199b015124b056b4b830"
46
+ "gitHead": "712ffe7d2bb5665aa951a9443959051564b40ddf"
44
47
  }
@@ -0,0 +1,24 @@
1
+ window.addEventListener("error", (event) => {
2
+ try {
3
+ // Try to avoid error-logging-loop
4
+ const data = {
5
+ error: event.message ?? null,
6
+ file: event.filename,
7
+ line: event.lineno ?? 0,
8
+ column: event.colno ?? 0,
9
+ stack: null,
10
+ };
11
+
12
+ fetch("/data/Logger/LogError", {
13
+ body: JSON.stringify(data),
14
+ headers: {
15
+ Accept: "application/json",
16
+ "Content-Type": "application/json; charset=utf-8",
17
+ "X-Requested-With": "XMLHttpRequest",
18
+ },
19
+ method: "POST",
20
+ });
21
+ } catch (ex) {
22
+ // ignore
23
+ }
24
+ });
package/src/index.ts CHANGED
@@ -1,12 +1,16 @@
1
+ import "./errorHandler.js";
2
+
1
3
  export { default as mitt } from "mitt";
2
4
  export { downloadBlob } from "./downloadBlob.js";
3
5
  export * from "./downloadRequest.js";
4
6
  export * from "./exportDataObject.js";
5
7
  export { default as expose } from "./expose.js";
6
8
  export { getLocalizedString } from "./getLocalizedString.js";
9
+ export * from "./has.js";
7
10
  export { default as localStorage } from "./localStorage.js";
8
11
  export { default as SessionHandler } from "./SessionHandler.js";
9
12
  export { default as UserSession } from "./UserSession.js";
10
13
  export { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from "./formDataToObject.js";
11
14
  export * from "./settings.js";
15
+
12
16
  export const version = __VERSION__;