@olenbetong/appframe-core 1.0.2 → 1.1.1

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.
@@ -59,19 +59,15 @@ function requireNamespace(root, namespace) {
59
59
 
60
60
  // src/warn.ts
61
61
  function warn(message, fallbackToAlert) {
62
- if (console && typeof console.warn === "function") {
63
- console.warn(message);
64
- } else if (console && typeof console.log === "function") {
65
- console.log(message);
66
- } else if (fallbackToAlert) {
67
- alert(message);
68
- }
62
+ console.warn(message);
69
63
  }
70
64
 
71
65
  // src/expose.ts
72
66
  function expose(name, value) {
73
67
  if (arguments.length !== 2) {
74
- throw new Error("Incorrect number of arguments passed to the expose function!");
68
+ throw new Error(
69
+ "Incorrect number of arguments passed to the expose function!"
70
+ );
75
71
  }
76
72
  if (Array.isArray(value)) {
77
73
  for (let func of value) {
@@ -79,7 +75,9 @@ function expose(name, value) {
79
75
  if (funcName) {
80
76
  expose(name, func);
81
77
  } else {
82
- throw new Error("Unable to detect name of function! Name it, or only supply one function and include name in first parameter.");
78
+ throw new Error(
79
+ "Unable to detect name of function! Name it, or only supply one function and include name in first parameter."
80
+ );
83
81
  }
84
82
  }
85
83
  } else {
@@ -98,7 +96,9 @@ function expose(name, value) {
98
96
  } else if (keyName && (typeof name === "object" || typeof name === "function")) {
99
97
  namespace = name;
100
98
  } else {
101
- throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");
99
+ throw new TypeError(
100
+ "Invalid typeof parameter 'name', or unable to parse pValue!"
101
+ );
102
102
  }
103
103
  if (has(namespace, keyName)) {
104
104
  warn([name, keyName].join(".") + " is already defined!");
@@ -183,10 +183,18 @@ function addDeveloperUtils() {
183
183
  if (string) {
184
184
  const escaped = string.replace(/'/g, "\\'");
185
185
  if (forCustomRoute) {
186
- const localized = afGetLocalizedString(string).replaceAll(/'/g, "\\'");
186
+ const localized = afGetLocalizedString(string).replaceAll(
187
+ /'/g,
188
+ "\\'"
189
+ );
187
190
  strings.push(`'${escaped}': '${localized}',`);
188
191
  } else {
189
- strings.push(`s['${escaped}'] = @Html(@context.AddLocalizableString("${string.replaceAll('"', '\\"')}"));`);
192
+ strings.push(
193
+ `s['${escaped}'] = @Html(@context.AddLocalizableString("${string.replaceAll(
194
+ '"',
195
+ '\\"'
196
+ )}"));`
197
+ );
190
198
  }
191
199
  }
192
200
  }
@@ -240,7 +248,10 @@ var LocalStorage = class {
240
248
  return value !== null ? JSON.parse(value) : defaultValue;
241
249
  }
242
250
  set(key2, value, global) {
243
- localStorage.setItem(this.getLocalStorageKey(key2, global), JSON.stringify(value));
251
+ localStorage.setItem(
252
+ this.getLocalStorageKey(key2, global),
253
+ JSON.stringify(value)
254
+ );
244
255
  }
245
256
  remove(key2, global) {
246
257
  const lsKey = this.getLocalStorageKey(key2, global);
@@ -420,14 +431,95 @@ var UserSession = class extends SessionHandler {
420
431
  }
421
432
  };
422
433
 
434
+ // src/formDataToObject.ts
435
+ function getFormValue(value, type) {
436
+ if (value === "") {
437
+ return null;
438
+ } else if (type === "number") {
439
+ let numValue = Number(value);
440
+ return isNaN(numValue) ? void 0 : numValue;
441
+ } else if (["date", "datetime", "time"].includes(type)) {
442
+ let dateValue = new Date(value);
443
+ return isNaN(dateValue.getTime()) ? void 0 : dateValue;
444
+ } else if (type === "boolean") {
445
+ return value.toLowerCase() === "true";
446
+ } else if (type === "bigint") {
447
+ return BigInt(value);
448
+ }
449
+ return value;
450
+ }
451
+ function formDataToObject(form, typeMap = {}) {
452
+ var _a;
453
+ let formData = new FormData(form);
454
+ let result = {};
455
+ for (let entry of formData.entries()) {
456
+ let field = entry[0];
457
+ let type = (_a = typeMap == null ? void 0 : typeMap[field]) != null ? _a : "string";
458
+ let value = getFormValue(entry[1], type);
459
+ if (result.hasOwnProperty(field)) {
460
+ if (Array.isArray(result[field])) {
461
+ result[field].push(value);
462
+ } else {
463
+ result[field] = [result[field], value];
464
+ }
465
+ } else {
466
+ result[field] = value;
467
+ }
468
+ }
469
+ return result;
470
+ }
471
+ function formDataToDataObjectRecord(form, dataObject) {
472
+ let fields = dataObject.getFields();
473
+ let types = Object.fromEntries(fields.map((field) => [field.name, field.type]));
474
+ return formDataToObject(form, types);
475
+ }
476
+ function formDataToProcedureParameters(form, procedure) {
477
+ let parameters = procedure.getParameters();
478
+ let types = Object.fromEntries(parameters.map((param) => [param.name, param.type]));
479
+ return formDataToObject(form, types);
480
+ }
481
+
482
+ // src/settings.ts
483
+ function getKey(article) {
484
+ const articleKey = article || af.article.id;
485
+ return `${articleKey}.${af.userSession.login}`;
486
+ }
487
+ function getSettings(setting, article) {
488
+ if (!(af == null ? void 0 : af.userSession))
489
+ return null;
490
+ const key2 = getKey(article);
491
+ const settings = JSON.parse(localStorage.getItem(key2) || "{}");
492
+ if (setting) {
493
+ return settings[setting] || null;
494
+ }
495
+ return settings;
496
+ }
497
+ function saveSettings(setting, value, article) {
498
+ if (!(af == null ? void 0 : af.userSession))
499
+ return;
500
+ const key2 = getKey(article);
501
+ let userSettings = JSON.parse(localStorage.getItem(key2) || "{}");
502
+ if (typeof value !== "undefined") {
503
+ userSettings[setting] = value;
504
+ } else {
505
+ userSettings = setting;
506
+ }
507
+ localStorage.setItem(key2, JSON.stringify(userSettings));
508
+ }
509
+
423
510
  // src/index.ts
424
- var version = "1.0.2";
511
+ var version = "1.1.1";
425
512
  export {
426
513
  SessionHandler,
427
514
  UserSession,
428
515
  expose,
516
+ formDataToDataObjectRecord,
517
+ formDataToObject,
518
+ formDataToProcedureParameters,
429
519
  getLocalizedString,
520
+ getSettings,
430
521
  localStorage_default as localStorage,
431
522
  mitt_default as mitt,
523
+ saveSettings,
432
524
  version
433
525
  };
@@ -1,4 +1,4 @@
1
- function b(t){return{all:t=t||new Map,on:function(e,n){var o=t.get(e);o?o.push(n):t.set(e,[n])},off:function(e,n){var o=t.get(e);o&&(n?o.splice(o.indexOf(n)>>>0,1):t.set(e,[]))},emit:function(e,n){var o=t.get(e);o&&o.slice().map(function(r){r(n)}),(o=t.get("*"))&&o.slice().map(function(r){r(e,n)})}}}function E(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var I=/^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(I);if(e===null)throw new TypeError("Unable to parse function!");return{name:e[1],args:e[2].split(","),body:e[3]}}function N(){}N.prototype=Object.create(null);var j=N;function w(t,e){if(typeof t=="object")if(typeof e=="string"){let n=e.split(".");return w(t,n)}else if(Array.isArray(e)){let n=t;for(let o=0;o<e.length;o++)n=n[e[o]]=n[e[o]]||new j;return n}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function x(t,e){console&&typeof console.warn=="function"?console.warn(t):console&&typeof console.log=="function"?console.log(t):e&&alert(t)}function L(t,e){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(e))for(let n of e){let{name:o}=h(n);if(o)L(t,n);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 n,o;if(typeof e=="function"&&(n=h(e).name),typeof t=="string"){let r=t.split(".");n||(n=r[r.length-1],r=r.slice(0,r.length-1)),o=w(window,r)}else if(n&&(typeof t=="object"||typeof t=="function"))o=t;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");E(o,n)?x([t,n].join(".")+" is already defined!"):o[n]=e}}async function k(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 n;if(((n=af==null?void 0:af.article)==null?void 0:n.i18n)!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,t)){af.article.i18n[t]=t;let o=k(t).then(r=>(af.article.i18n[t]=r,r));if(e)return o}return af.article.i18n[t]}else return t}var m="__UNLOCALIZED_STRINGS__",u=window[m]||new Set;window[m]||(window[m]=u);function H(){document.readyState!=="loading"&&(T(),document.removeEventListener("readystatechange",H))}document.readyState!=="loading"?T():document.addEventListener("readystatechange",H);function $(){let{af:t}=window;return t&&t.userSession&&t.userSession.isDeveloper}function T(){if($()){if(typeof window.__doNothingWithStrings=="function"){let t=window.__doNothingWithStrings();for(let e of Object.keys(t))u.add(e)}window[m]||(window[m]=u),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(t){let e=[];for(let n of u)if(n){let o=n.replace(/'/g,"\\'");if(t){let r=z(n).replaceAll(/'/g,"\\'");e.push(`'${o}': '${r}',`)}else e.push(`s['${o}'] = @Html(@context.AddLocalizableString("${n.replaceAll('"','\\"')}"));`)}return t?`// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used
1
+ function E(t){return{all:t=t||new Map,on:function(e,n){var r=t.get(e);r?r.push(n):t.set(e,[n])},off:function(e,n){var r=t.get(e);r&&(n?r.splice(r.indexOf(n)>>>0,1):t.set(e,[]))},emit:function(e,n){var r=t.get(e);r&&r.slice().map(function(o){o(n)}),(r=t.get("*"))&&r.slice().map(function(o){o(e,n)})}}}function x(t,e){return Object.prototype.hasOwnProperty.call(t,e)}var P=/^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 w(t){var e=t.toString().match(P);if(e===null)throw new TypeError("Unable to parse function!");return{name:e[1],args:e[2].split(","),body:e[3]}}function O(){}O.prototype=Object.create(null);var _=O;function S(t,e){if(typeof t=="object")if(typeof e=="string"){let n=e.split(".");return S(t,n)}else if(Array.isArray(e)){let n=t;for(let r=0;r<e.length;r++)n=n[e[r]]=n[e[r]]||new _;return n}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function T(t,e){console.warn(t)}function L(t,e){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(e))for(let n of e){let{name:r}=w(n);if(r)L(t,n);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 n,r;if(typeof e=="function"&&(n=w(e).name),typeof t=="string"){let o=t.split(".");n||(n=o[o.length-1],o=o.slice(0,o.length-1)),r=S(window,o)}else if(n&&(typeof t=="object"||typeof t=="function"))r=t;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");x(r,n)?T([t,n].join(".")+" is already defined!"):r[n]=e}}async function k(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 A(t,e){var n;if(((n=af==null?void 0:af.article)==null?void 0:n.i18n)!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,t)){af.article.i18n[t]=t;let r=k(t).then(o=>(af.article.i18n[t]=o,o));if(e)return r}return af.article.i18n[t]}else return t}var y="__UNLOCALIZED_STRINGS__",g=window[y]||new Set;window[y]||(window[y]=g);function D(){document.readyState!=="loading"&&(H(),document.removeEventListener("readystatechange",D))}document.readyState!=="loading"?H():document.addEventListener("readystatechange",D);function $(){let{af:t}=window;return t&&t.userSession&&t.userSession.isDeveloper}function H(){if($()){if(typeof window.__doNothingWithStrings=="function"){let t=window.__doNothingWithStrings();for(let e of Object.keys(t))g.add(e)}window[y]||(window[y]=g),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(t){let e=[];for(let n of g)if(n){let r=n.replace(/'/g,"\\'");if(t){let o=A(n).replaceAll(/'/g,"\\'");e.push(`'${r}': '${o}',`)}else e.push(`s['${r}'] = @Html(@context.AddLocalizableString("${n.replaceAll('"','\\"')}"));`)}return t?`// 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
4
  ${e.join(`
@@ -16,23 +16,23 @@ ${e.join(`
16
16
  `)}
17
17
  return s;
18
18
  }
19
- <\/script>`})}}function f(t){let e=z(t);return e===t&&!u.has(t)&&u.add(t),e}function O(t){var e;return[((e=af==null?void 0:af.article)==null?void 0:e.id)||"","common",t].join(".")}var _=class{isPersisted(){return!0}getLocalStorageKey(e,n){return n?["common",e].join("."):O(e)}get(e,n,o){let r=this.getLocalStorageKey(e,o),p=localStorage.getItem(r);return p!==null?JSON.parse(p):n}set(e,n,o){localStorage.setItem(this.getLocalStorageKey(e,o),JSON.stringify(n))}remove(e,n){let o=this.getLocalStorageKey(e,n);return localStorage.getItem(o)!==null?(localStorage.removeItem(o),!0):!1}clear(){let e=O("");for(let n in localStorage)n.slice(0,e.length)===e&&localStorage.removeItem(n)}},q=new _;var v=class{constructor(){this.eventHandler=b();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 n=()=>{this.detachEvent("onAuthenticated",n),e()};if(this.attachEvent("onAuthenticated",n),this.showingDialog!==!0){this.showingDialog=!0;let o=document.createElement("div");o.className="session-expired-container",o.innerHTML=`
19
+ <\/script>`})}}function p(t){let e=A(t);return e===t&&!g.has(t)&&g.add(t),e}function z(t){var e;return[((e=af==null?void 0:af.article)==null?void 0:e.id)||"","common",t].join(".")}var N=class{isPersisted(){return!0}getLocalStorageKey(e,n){return n?["common",e].join("."):z(e)}get(e,n,r){let o=this.getLocalStorageKey(e,r),c=localStorage.getItem(o);return c!==null?JSON.parse(c):n}set(e,n,r){localStorage.setItem(this.getLocalStorageKey(e,r),JSON.stringify(n))}remove(e,n){let r=this.getLocalStorageKey(e,n);return localStorage.getItem(r)!==null?(localStorage.removeItem(r),!0):!1}clear(){let e=z("");for(let n in localStorage)n.slice(0,e.length)===e&&localStorage.removeItem(n)}},R=new N;var b=class{constructor(){this.eventHandler=E();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 n=()=>{this.detachEvent("onAuthenticated",n),e()};if(this.attachEvent("onAuthenticated",n),this.showingDialog!==!0){this.showingDialog=!0;let r=document.createElement("div");r.className="session-expired-container",r.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">${f("Username")}</label>
25
+ <label for="username">${p("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">${f("Password")}</label>
29
+ <label for="password">${p("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
- ${f("Log in")}
35
+ ${p("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 r=af.userSession.login?v.messages.relog:v.messages.login,p=o.querySelector(".message"),c=o.querySelector(".alert-warning"),a=o.querySelector("input[type=text]"),A=o.querySelector(".sign-in"),i=o.querySelector("input[type=password]");if(p!==null&&a!==null&&c!==null&&a!==null&&A!==null&&i!==null){p.innerText=f(r),a.value=af.userSession.login||"",a.disabled=!!af.userSession.login,a.readOnly=!!af.userSession.login,document.body.appendChild(o);let g=async()=>{i.disabled=!0;let s=new Request("/login",{body:JSON.stringify({username:a.value,password:i.value,remember:!1}),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"});try{let d=await(await fetch(s)).json();if(d.success)document.body.removeChild(o),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),c.parentNode&&(c.parentNode.style.display="none");else throw new Error(d.error)}catch(y){if(y&&typeof y=="object"){let d=y;i.disabled=!1,i.classList.toggle("invalid",!0),i.value="",i.focus(),c.innerText=d.message?d.message:String(d),c.parentNode&&(c.parentNode.style.display="initial")}}};A.addEventListener("click",g),i.addEventListener("keyup",s=>{s.key==="Enter"&&g()}),i.addEventListener("change",s=>{s.key==="Enter"&&g()}),a.addEventListener("keyup",s=>{s.key==="Enter"&&g()}),a.addEventListener("change",s=>{s.key==="Enter"&&g()}),i.focus()}}}attachEvent(e,n){return this.eventHandler.on(e,n)}detachEvent(e,n){return this.eventHandler.off(e,n)}},l=v;l.messages={login:"Log in",relog:"Session expired - log in"};var S=class extends l{constructor(n){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,n)}};var re="1.0.2";export{l as SessionHandler,S as UserSession,L as expose,f as getLocalizedString,q as localStorage,b as mitt,re as version};
47
+ `;let o=af.userSession.login?b.messages.relog:b.messages.login,c=r.querySelector(".message"),i=r.querySelector(".alert-warning"),s=r.querySelector("input[type=text]"),d=r.querySelector(".sign-in"),a=r.querySelector("input[type=password]");if(c!==null&&s!==null&&i!==null&&s!==null&&d!==null&&a!==null){c.innerText=p(o),s.value=af.userSession.login||"",s.disabled=!!af.userSession.login,s.readOnly=!!af.userSession.login,document.body.appendChild(r);let m=async()=>{a.disabled=!0;let l=new Request("/login",{body:JSON.stringify({username:s.value,password:a.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(l)).json();if(f.success)document.body.removeChild(r),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),i.parentNode&&(i.parentNode.style.display="none");else throw new Error(f.error)}catch(h){if(h&&typeof h=="object"){let f=h;a.disabled=!1,a.classList.toggle("invalid",!0),a.value="",a.focus(),i.innerText=f.message?f.message:String(f),i.parentNode&&(i.parentNode.style.display="initial")}}};d.addEventListener("click",m),a.addEventListener("keyup",l=>{l.key==="Enter"&&m()}),a.addEventListener("change",l=>{l.key==="Enter"&&m()}),s.addEventListener("keyup",l=>{l.key==="Enter"&&m()}),s.addEventListener("change",l=>{l.key==="Enter"&&m()}),a.focus()}}}attachEvent(e,n){return this.eventHandler.on(e,n)}detachEvent(e,n){return this.eventHandler.off(e,n)}},u=b;u.messages={login:"Log in",relog:"Session expired - log in"};var v=class extends u{constructor(n){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,n)}};function q(t,e){if(t==="")return null;if(e==="number"){let n=Number(t);return isNaN(n)?void 0:n}else if(["date","datetime","time"].includes(e)){let n=new Date(t);return isNaN(n.getTime())?void 0:n}else{if(e==="boolean")return t.toLowerCase()==="true";if(e==="bigint")return BigInt(t)}return t}function j(t,e={}){var o;let n=new FormData(t),r={};for(let c of n.entries()){let i=c[0],s=(o=e==null?void 0:e[i])!=null?o:"string",d=q(c[1],s);r.hasOwnProperty(i)?Array.isArray(r[i])?r[i].push(d):r[i]=[r[i],d]:r[i]=d}return r}function F(t,e){let n=e.getFields(),r=Object.fromEntries(n.map(o=>[o.name,o.type]));return j(t,r)}function C(t,e){let n=e.getParameters(),r=Object.fromEntries(n.map(o=>[o.name,o.type]));return j(t,r)}function I(t){return`${t||af.article.id}.${af.userSession.login}`}function ue(t,e){if(!(af!=null&&af.userSession))return null;let n=I(e),r=JSON.parse(localStorage.getItem(n)||"{}");return t?r[t]||null:r}function de(t,e,n){if(!(af!=null&&af.userSession))return;let r=I(n),o=JSON.parse(localStorage.getItem(r)||"{}");typeof e!="undefined"?o[t]=e:o=t,localStorage.setItem(r,JSON.stringify(o))}var ge="1.1.1";export{u as SessionHandler,v as UserSession,L as expose,F as formDataToDataObjectRecord,j as formDataToObject,C as formDataToProcedureParameters,p as getLocalizedString,ue as getSettings,R as localStorage,E as mitt,de as saveSettings,ge 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/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/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 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 if (console && typeof console.warn === \"function\") {\n console.warn(message);\n } else if (console && typeof console.log === \"function\") {\n console.log(message);\n } else if (fallbackToAlert) {\n alert(message);\n }\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", "export { default as mitt } from \"mitt\";\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 const version = __VERSION__;\n"],
5
- "mappings": "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",
6
- "names": []
3
+ "sources": ["../../../../node_modules/mitt/src/index.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 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 { 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": "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",
6
+ "names": ["all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "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"]
7
7
  }
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  var af = af || {};
2
3
  af.common = (() => {
3
4
  var __defProp = Object.defineProperty;
@@ -24,9 +25,14 @@ af.common = (() => {
24
25
  SessionHandler: () => SessionHandler,
25
26
  UserSession: () => UserSession,
26
27
  expose: () => expose,
28
+ formDataToDataObjectRecord: () => formDataToDataObjectRecord,
29
+ formDataToObject: () => formDataToObject,
30
+ formDataToProcedureParameters: () => formDataToProcedureParameters,
27
31
  getLocalizedString: () => getLocalizedString,
32
+ getSettings: () => getSettings,
28
33
  localStorage: () => localStorage_default,
29
34
  mitt: () => mitt_default,
35
+ saveSettings: () => saveSettings,
30
36
  version: () => version
31
37
  });
32
38
 
@@ -91,19 +97,15 @@ af.common = (() => {
91
97
 
92
98
  // src/warn.ts
93
99
  function warn(message, fallbackToAlert) {
94
- if (console && typeof console.warn === "function") {
95
- console.warn(message);
96
- } else if (console && typeof console.log === "function") {
97
- console.log(message);
98
- } else if (fallbackToAlert) {
99
- alert(message);
100
- }
100
+ console.warn(message);
101
101
  }
102
102
 
103
103
  // src/expose.ts
104
104
  function expose(name, value) {
105
105
  if (arguments.length !== 2) {
106
- throw new Error("Incorrect number of arguments passed to the expose function!");
106
+ throw new Error(
107
+ "Incorrect number of arguments passed to the expose function!"
108
+ );
107
109
  }
108
110
  if (Array.isArray(value)) {
109
111
  for (let func of value) {
@@ -111,7 +113,9 @@ af.common = (() => {
111
113
  if (funcName) {
112
114
  expose(name, func);
113
115
  } else {
114
- throw new Error("Unable to detect name of function! Name it, or only supply one function and include name in first parameter.");
116
+ throw new Error(
117
+ "Unable to detect name of function! Name it, or only supply one function and include name in first parameter."
118
+ );
115
119
  }
116
120
  }
117
121
  } else {
@@ -130,7 +134,9 @@ af.common = (() => {
130
134
  } else if (keyName && (typeof name === "object" || typeof name === "function")) {
131
135
  namespace = name;
132
136
  } else {
133
- throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");
137
+ throw new TypeError(
138
+ "Invalid typeof parameter 'name', or unable to parse pValue!"
139
+ );
134
140
  }
135
141
  if (has(namespace, keyName)) {
136
142
  warn([name, keyName].join(".") + " is already defined!");
@@ -215,10 +221,18 @@ af.common = (() => {
215
221
  if (string) {
216
222
  const escaped = string.replace(/'/g, "\\'");
217
223
  if (forCustomRoute) {
218
- const localized = afGetLocalizedString(string).replaceAll(/'/g, "\\'");
224
+ const localized = afGetLocalizedString(string).replaceAll(
225
+ /'/g,
226
+ "\\'"
227
+ );
219
228
  strings.push(`'${escaped}': '${localized}',`);
220
229
  } else {
221
- strings.push(`s['${escaped}'] = @Html(@context.AddLocalizableString("${string.replaceAll('"', '\\"')}"));`);
230
+ strings.push(
231
+ `s['${escaped}'] = @Html(@context.AddLocalizableString("${string.replaceAll(
232
+ '"',
233
+ '\\"'
234
+ )}"));`
235
+ );
222
236
  }
223
237
  }
224
238
  }
@@ -272,7 +286,10 @@ return s;
272
286
  return value !== null ? JSON.parse(value) : defaultValue;
273
287
  }
274
288
  set(key2, value, global) {
275
- localStorage.setItem(this.getLocalStorageKey(key2, global), JSON.stringify(value));
289
+ localStorage.setItem(
290
+ this.getLocalStorageKey(key2, global),
291
+ JSON.stringify(value)
292
+ );
276
293
  }
277
294
  remove(key2, global) {
278
295
  const lsKey = this.getLocalStorageKey(key2, global);
@@ -452,7 +469,83 @@ return s;
452
469
  }
453
470
  };
454
471
 
472
+ // src/formDataToObject.ts
473
+ function getFormValue(value, type) {
474
+ if (value === "") {
475
+ return null;
476
+ } else if (type === "number") {
477
+ let numValue = Number(value);
478
+ return isNaN(numValue) ? void 0 : numValue;
479
+ } else if (["date", "datetime", "time"].includes(type)) {
480
+ let dateValue = new Date(value);
481
+ return isNaN(dateValue.getTime()) ? void 0 : dateValue;
482
+ } else if (type === "boolean") {
483
+ return value.toLowerCase() === "true";
484
+ } else if (type === "bigint") {
485
+ return BigInt(value);
486
+ }
487
+ return value;
488
+ }
489
+ function formDataToObject(form, typeMap = {}) {
490
+ var _a;
491
+ let formData = new FormData(form);
492
+ let result = {};
493
+ for (let entry of formData.entries()) {
494
+ let field = entry[0];
495
+ let type = (_a = typeMap == null ? void 0 : typeMap[field]) != null ? _a : "string";
496
+ let value = getFormValue(entry[1], type);
497
+ if (result.hasOwnProperty(field)) {
498
+ if (Array.isArray(result[field])) {
499
+ result[field].push(value);
500
+ } else {
501
+ result[field] = [result[field], value];
502
+ }
503
+ } else {
504
+ result[field] = value;
505
+ }
506
+ }
507
+ return result;
508
+ }
509
+ function formDataToDataObjectRecord(form, dataObject) {
510
+ let fields = dataObject.getFields();
511
+ let types = Object.fromEntries(fields.map((field) => [field.name, field.type]));
512
+ return formDataToObject(form, types);
513
+ }
514
+ function formDataToProcedureParameters(form, procedure) {
515
+ let parameters = procedure.getParameters();
516
+ let types = Object.fromEntries(parameters.map((param) => [param.name, param.type]));
517
+ return formDataToObject(form, types);
518
+ }
519
+
520
+ // src/settings.ts
521
+ function getKey(article) {
522
+ const articleKey = article || af.article.id;
523
+ return `${articleKey}.${af.userSession.login}`;
524
+ }
525
+ function getSettings(setting, article) {
526
+ if (!(af == null ? void 0 : af.userSession))
527
+ return null;
528
+ const key2 = getKey(article);
529
+ const settings = JSON.parse(localStorage.getItem(key2) || "{}");
530
+ if (setting) {
531
+ return settings[setting] || null;
532
+ }
533
+ return settings;
534
+ }
535
+ function saveSettings(setting, value, article) {
536
+ if (!(af == null ? void 0 : af.userSession))
537
+ return;
538
+ const key2 = getKey(article);
539
+ let userSettings = JSON.parse(localStorage.getItem(key2) || "{}");
540
+ if (typeof value !== "undefined") {
541
+ userSettings[setting] = value;
542
+ } else {
543
+ userSettings = setting;
544
+ }
545
+ localStorage.setItem(key2, JSON.stringify(userSettings));
546
+ }
547
+
455
548
  // src/index.ts
456
- var version = "1.0.2";
549
+ var version = "1.1.1";
457
550
  return __toCommonJS(src_exports);
458
551
  })();
@@ -1,4 +1,4 @@
1
- var af=af||{};af.common=(()=>{var x=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var M=Object.prototype.hasOwnProperty;var C=(t,e)=>{for(var n in e)x(t,n,{get:e[n],enumerable:!0})},D=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of q(e))!M.call(t,r)&&r!==n&&x(t,r,{get:()=>e[r],enumerable:!(o=$(e,r))||o.enumerable});return t};var R=t=>D(x({},"__esModule",{value:!0}),t);var W={};C(W,{SessionHandler:()=>l,UserSession:()=>y,expose:()=>b,getLocalizedString:()=>c,localStorage:()=>k,mitt:()=>w,version:()=>F});function w(t){return{all:t=t||new Map,on:function(e,n){var o=t.get(e);o?o.push(n):t.set(e,[n])},off:function(e,n){var o=t.get(e);o&&(n?o.splice(o.indexOf(n)>>>0,1):t.set(e,[]))},emit:function(e,n){var o=t.get(e);o&&o.slice().map(function(r){r(n)}),(o=t.get("*"))&&o.slice().map(function(r){r(e,n)})}}}function L(t,e){return Object.prototype.hasOwnProperty.call(t,e)}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 v(t){var e=t.toString().match(K);if(e===null)throw new TypeError("Unable to parse function!");return{name:e[1],args:e[2].split(","),body:e[3]}}function j(){}j.prototype=Object.create(null);var z=j;function S(t,e){if(typeof t=="object")if(typeof e=="string"){let n=e.split(".");return S(t,n)}else if(Array.isArray(e)){let n=t;for(let o=0;o<e.length;o++)n=n[e[o]]=n[e[o]]||new z;return n}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function _(t,e){console&&typeof console.warn=="function"?console.warn(t):console&&typeof console.log=="function"?console.log(t):e&&alert(t)}function b(t,e){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(e))for(let n of e){let{name:o}=v(n);if(o)b(t,n);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 n,o;if(typeof e=="function"&&(n=v(e).name),typeof t=="string"){let r=t.split(".");n||(n=r[r.length-1],r=r.slice(0,r.length-1)),o=S(window,r)}else if(n&&(typeof t=="object"||typeof t=="function"))o=t;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");L(o,n)?_([t,n].join(".")+" is already defined!"):o[n]=e}}async function P(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 H(t,e){var n;if(((n=af==null?void 0:af.article)==null?void 0:n.i18n)!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,t)){af.article.i18n[t]=t;let o=P(t).then(r=>(af.article.i18n[t]=r,r));if(e)return o}return af.article.i18n[t]}else return t}var m="__UNLOCALIZED_STRINGS__",f=window[m]||new Set;window[m]||(window[m]=f);function T(){document.readyState!=="loading"&&(O(),document.removeEventListener("readystatechange",T))}document.readyState!=="loading"?O():document.addEventListener("readystatechange",T);function U(){let{af:t}=window;return t&&t.userSession&&t.userSession.isDeveloper}function O(){if(U()){if(typeof window.__doNothingWithStrings=="function"){let t=window.__doNothingWithStrings();for(let e of Object.keys(t))f.add(e)}window[m]||(window[m]=f),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(t){let e=[];for(let n of f)if(n){let o=n.replace(/'/g,"\\'");if(t){let r=H(n).replaceAll(/'/g,"\\'");e.push(`'${o}': '${r}',`)}else e.push(`s['${o}'] = @Html(@context.AddLocalizableString("${n.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 L=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var C=Object.prototype.hasOwnProperty;var K=(t,e)=>{for(var n in e)L(t,n,{get:e[n],enumerable:!0})},M=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of F(e))!C.call(t,o)&&o!==n&&L(t,o,{get:()=>e[o],enumerable:!(r=q(e,o))||r.enumerable});return t};var U=t=>M(L({},"__esModule",{value:!0}),t);var Q={};K(Q,{SessionHandler:()=>u,UserSession:()=>h,expose:()=>E,formDataToDataObjectRecord:()=>k,formDataToObject:()=>T,formDataToProcedureParameters:()=>$,getLocalizedString:()=>d,getSettings:()=>V,localStorage:()=>P,mitt:()=>S,saveSettings:()=>X,version:()=>B});function S(t){return{all:t=t||new Map,on:function(e,n){var r=t.get(e);r?r.push(n):t.set(e,[n])},off:function(e,n){var r=t.get(e);r&&(n?r.splice(r.indexOf(n)>>>0,1):t.set(e,[]))},emit:function(e,n){var r=t.get(e);r&&r.slice().map(function(o){o(n)}),(r=t.get("*"))&&r.slice().map(function(o){o(e,n)})}}}function N(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 b(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 _(){}_.prototype=Object.create(null);var A=_;function v(t,e){if(typeof t=="object")if(typeof e=="string"){let n=e.split(".");return v(t,n)}else if(Array.isArray(e)){let n=t;for(let r=0;r<e.length;r++)n=n[e[r]]=n[e[r]]||new A;return n}else throw new TypeError("Invalid type of parameter 'namespace'");else throw new TypeError("Invalid type of parameter 'root'")}function j(t,e){console.warn(t)}function E(t,e){if(arguments.length!==2)throw new Error("Incorrect number of arguments passed to the expose function!");if(Array.isArray(e))for(let n of e){let{name:r}=b(n);if(r)E(t,n);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 n,r;if(typeof e=="function"&&(n=b(e).name),typeof t=="string"){let o=t.split(".");n||(n=o[o.length-1],o=o.slice(0,o.length-1)),r=v(window,o)}else if(n&&(typeof t=="object"||typeof t=="function"))r=t;else throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");N(r,n)?j([t,n].join(".")+" is already defined!"):r[n]=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 D(t,e){var n;if(((n=af==null?void 0:af.article)==null?void 0:n.i18n)!==void 0){if(!Object.prototype.hasOwnProperty.call(af.article.i18n,t)){af.article.i18n[t]=t;let r=Z(t).then(o=>(af.article.i18n[t]=o,o));if(e)return r}return af.article.i18n[t]}else return t}var y="__UNLOCALIZED_STRINGS__",p=window[y]||new Set;window[y]||(window[y]=p);function H(){document.readyState!=="loading"&&(z(),document.removeEventListener("readystatechange",H))}document.readyState!=="loading"?z():document.addEventListener("readystatechange",H);function J(){let{af:t}=window;return t&&t.userSession&&t.userSession.isDeveloper}function z(){if(J()){if(typeof window.__doNothingWithStrings=="function"){let t=window.__doNothingWithStrings();for(let e of Object.keys(t))p.add(e)}window[y]||(window[y]=p),window.__getUnlocalizedStrings||(window.__getUnlocalizedStrings=function(t){let e=[];for(let n of p)if(n){let r=n.replace(/'/g,"\\'");if(t){let o=D(n).replaceAll(/'/g,"\\'");e.push(`'${r}': '${o}',`)}else e.push(`s['${r}'] = @Html(@context.AddLocalizableString("${n.replaceAll('"','\\"')}"));`)}return t?`// 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
4
  ${e.join(`
@@ -16,23 +16,23 @@ ${e.join(`
16
16
  `)}
17
17
  return s;
18
18
  }
19
- <\/script>`})}}function c(t){let e=H(t);return e===t&&!f.has(t)&&f.add(t),e}function I(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,n){return n?["common",e].join("."):I(e)}get(e,n,o){let r=this.getLocalStorageKey(e,o),p=localStorage.getItem(r);return p!==null?JSON.parse(p):n}set(e,n,o){localStorage.setItem(this.getLocalStorageKey(e,o),JSON.stringify(n))}remove(e,n){let o=this.getLocalStorageKey(e,n);return localStorage.getItem(o)!==null?(localStorage.removeItem(o),!0):!1}clear(){let e=I("");for(let n in localStorage)n.slice(0,e.length)===e&&localStorage.removeItem(n)}},k=new A;var E=class{constructor(){this.eventHandler=w();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 n=()=>{this.detachEvent("onAuthenticated",n),e()};if(this.attachEvent("onAuthenticated",n),this.showingDialog!==!0){this.showingDialog=!0;let o=document.createElement("div");o.className="session-expired-container",o.innerHTML=`
19
+ <\/script>`})}}function d(t){let e=D(t);return e===t&&!p.has(t)&&p.add(t),e}function I(t){var e;return[((e=af==null?void 0:af.article)==null?void 0:e.id)||"","common",t].join(".")}var O=class{isPersisted(){return!0}getLocalStorageKey(e,n){return n?["common",e].join("."):I(e)}get(e,n,r){let o=this.getLocalStorageKey(e,r),c=localStorage.getItem(o);return c!==null?JSON.parse(c):n}set(e,n,r){localStorage.setItem(this.getLocalStorageKey(e,r),JSON.stringify(n))}remove(e,n){let r=this.getLocalStorageKey(e,n);return localStorage.getItem(r)!==null?(localStorage.removeItem(r),!0):!1}clear(){let e=I("");for(let n in localStorage)n.slice(0,e.length)===e&&localStorage.removeItem(n)}},P=new O;var x=class{constructor(){this.eventHandler=S();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 n=()=>{this.detachEvent("onAuthenticated",n),e()};if(this.attachEvent("onAuthenticated",n),this.showingDialog!==!0){this.showingDialog=!0;let r=document.createElement("div");r.className="session-expired-container",r.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">${c("Username")}</label>
25
+ <label for="username">${d("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">${c("Password")}</label>
29
+ <label for="password">${d("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
- ${c("Log in")}
35
+ ${d("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 r=af.userSession.login?E.messages.relog:E.messages.login,p=o.querySelector(".message"),d=o.querySelector(".alert-warning"),a=o.querySelector("input[type=text]"),N=o.querySelector(".sign-in"),i=o.querySelector("input[type=password]");if(p!==null&&a!==null&&d!==null&&a!==null&&N!==null&&i!==null){p.innerText=c(r),a.value=af.userSession.login||"",a.disabled=!!af.userSession.login,a.readOnly=!!af.userSession.login,document.body.appendChild(o);let g=async()=>{i.disabled=!0;let s=new Request("/login",{body:JSON.stringify({username:a.value,password:i.value,remember:!1}),headers:{Accept:"application/json","Content-Type":"application/json; charset=utf-8","X-Requested-With":"XMLHttpRequest"},method:"POST"});try{let u=await(await fetch(s)).json();if(u.success)document.body.removeChild(o),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),d.parentNode&&(d.parentNode.style.display="none");else throw new Error(u.error)}catch(h){if(h&&typeof h=="object"){let u=h;i.disabled=!1,i.classList.toggle("invalid",!0),i.value="",i.focus(),d.innerText=u.message?u.message:String(u),d.parentNode&&(d.parentNode.style.display="initial")}}};N.addEventListener("click",g),i.addEventListener("keyup",s=>{s.key==="Enter"&&g()}),i.addEventListener("change",s=>{s.key==="Enter"&&g()}),a.addEventListener("keyup",s=>{s.key==="Enter"&&g()}),a.addEventListener("change",s=>{s.key==="Enter"&&g()}),i.focus()}}}attachEvent(e,n){return this.eventHandler.on(e,n)}detachEvent(e,n){return this.eventHandler.off(e,n)}},l=E;l.messages={login:"Log in",relog:"Session expired - log in"};var y=class extends l{constructor(n){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,n)}};var F="1.0.2";return R(W);})();
47
+ `;let o=af.userSession.login?x.messages.relog:x.messages.login,c=r.querySelector(".message"),i=r.querySelector(".alert-warning"),s=r.querySelector("input[type=text]"),f=r.querySelector(".sign-in"),a=r.querySelector("input[type=password]");if(c!==null&&s!==null&&i!==null&&s!==null&&f!==null&&a!==null){c.innerText=d(o),s.value=af.userSession.login||"",s.disabled=!!af.userSession.login,s.readOnly=!!af.userSession.login,document.body.appendChild(r);let m=async()=>{a.disabled=!0;let l=new Request("/login",{body:JSON.stringify({username:s.value,password:a.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(l)).json();if(g.success)document.body.removeChild(r),this.showingDialog=!1,this.eventHandler.emit("onAuthenticated"),i.parentNode&&(i.parentNode.style.display="none");else throw new Error(g.error)}catch(w){if(w&&typeof w=="object"){let g=w;a.disabled=!1,a.classList.toggle("invalid",!0),a.value="",a.focus(),i.innerText=g.message?g.message:String(g),i.parentNode&&(i.parentNode.style.display="initial")}}};f.addEventListener("click",m),a.addEventListener("keyup",l=>{l.key==="Enter"&&m()}),a.addEventListener("change",l=>{l.key==="Enter"&&m()}),s.addEventListener("keyup",l=>{l.key==="Enter"&&m()}),s.addEventListener("change",l=>{l.key==="Enter"&&m()}),a.focus()}}}attachEvent(e,n){return this.eventHandler.on(e,n)}detachEvent(e,n){return this.eventHandler.off(e,n)}},u=x;u.messages={login:"Log in",relog:"Session expired - log in"};var h=class extends u{constructor(n){super();this.decimalSeparator=".";this.groupSeparator=null;this.shortDateFormat="dd.MM.yyyy";this.login=null;this.isDeveloper=!1;this.formats={},Object.assign(this,n)}};function G(t,e){if(t==="")return null;if(e==="number"){let n=Number(t);return isNaN(n)?void 0:n}else if(["date","datetime","time"].includes(e)){let n=new Date(t);return isNaN(n.getTime())?void 0:n}else{if(e==="boolean")return t.toLowerCase()==="true";if(e==="bigint")return BigInt(t)}return t}function T(t,e={}){var o;let n=new FormData(t),r={};for(let c of n.entries()){let i=c[0],s=(o=e==null?void 0:e[i])!=null?o:"string",f=G(c[1],s);r.hasOwnProperty(i)?Array.isArray(r[i])?r[i].push(f):r[i]=[r[i],f]:r[i]=f}return r}function k(t,e){let n=e.getFields(),r=Object.fromEntries(n.map(o=>[o.name,o.type]));return T(t,r)}function $(t,e){let n=e.getParameters(),r=Object.fromEntries(n.map(o=>[o.name,o.type]));return T(t,r)}function R(t){return`${t||af.article.id}.${af.userSession.login}`}function V(t,e){if(!(af!=null&&af.userSession))return null;let n=R(e),r=JSON.parse(localStorage.getItem(n)||"{}");return t?r[t]||null:r}function X(t,e,n){if(!(af!=null&&af.userSession))return;let r=R(n),o=JSON.parse(localStorage.getItem(r)||"{}");typeof e!="undefined"?o[t]=e:o=t,localStorage.setItem(r,JSON.stringify(o))}var B="1.1.1";return U(Q);})();
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/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"],
4
- "sourcesContent": ["export { default as mitt } from \"mitt\";\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 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 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 if (console && typeof console.warn === \"function\") {\n console.warn(message);\n } else if (console && typeof console.log === \"function\") {\n console.log(message);\n } else if (fallbackToAlert) {\n alert(message);\n }\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"],
5
- "mappings": "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",
6
- "names": []
3
+ "sources": ["../../src/index.ts", "../../../../node_modules/mitt/src/index.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 { 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 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", "expose", "formDataToDataObjectRecord", "formDataToObject", "formDataToProcedureParameters", "getLocalizedString", "getSettings", "localStorage_default", "mitt_default", "saveSettings", "version", "all", "Map", "on", "type", "handler", "handlers", "get", "push", "set", "off", "splice", "indexOf", "emit", "evt", "slice", "map", "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"]
7
7
  }
@@ -0,0 +1,26 @@
1
+ import type { DataObject, Procedure } from "@olenbetong/appframe-data";
2
+ /**
3
+ * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.
4
+ * @param form HTML form element to get form data from.
5
+ * @param typeMap A mapping from field name to field type
6
+ * @returns
7
+ */
8
+ export declare function formDataToObject<T = any>(form: HTMLFormElement, typeMap?: Record<string, string>): Partial<T>;
9
+ /**
10
+ * Creates a partial data object record from form data. The name property is mapped
11
+ * to field name.
12
+ *
13
+ * @param form HTML form element to get FormData from
14
+ * @param dataObject Data object for which to create a record from the form data
15
+ * @returns {Partial<T>} Partial data object record
16
+ */
17
+ export declare function formDataToDataObjectRecord<T>(form: HTMLFormElement, dataObject: DataObject<T>): Partial<T>;
18
+ /**
19
+ * Creates procedure parameters from form data. The name property is mapped
20
+ * to parameter names.
21
+ *
22
+ * @param form HTML Form element to get FormData from
23
+ * @param procedure Appframe Procedure to create parameters for
24
+ * @returns
25
+ */
26
+ export declare function formDataToProcedureParameters<T>(form: HTMLFormElement, procedure: Procedure<T, any>): T;
@@ -0,0 +1,73 @@
1
+ function getFormValue(value, type) {
2
+ if (value === "") {
3
+ return null;
4
+ }
5
+ else if (type === "number") {
6
+ let numValue = Number(value);
7
+ return isNaN(numValue) ? undefined : numValue;
8
+ }
9
+ else if (["date", "datetime", "time"].includes(type)) {
10
+ let dateValue = new Date(value);
11
+ return isNaN(dateValue.getTime()) ? undefined : dateValue;
12
+ }
13
+ else if (type === "boolean") {
14
+ return value.toLowerCase() === "true";
15
+ }
16
+ else if (type === "bigint") {
17
+ return BigInt(value);
18
+ }
19
+ return value;
20
+ }
21
+ /**
22
+ * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.
23
+ * @param form HTML form element to get form data from.
24
+ * @param typeMap A mapping from field name to field type
25
+ * @returns
26
+ */
27
+ export function formDataToObject(form, typeMap = {}) {
28
+ let formData = new FormData(form);
29
+ let result = {};
30
+ for (let entry of formData.entries()) {
31
+ let field = entry[0];
32
+ let type = typeMap?.[field] ?? "string";
33
+ let value = getFormValue(entry[1], type);
34
+ if (result.hasOwnProperty(field)) {
35
+ if (Array.isArray(result[field])) {
36
+ result[field].push(value);
37
+ }
38
+ else {
39
+ result[field] = [result[field], value];
40
+ }
41
+ }
42
+ else {
43
+ result[field] = value;
44
+ }
45
+ }
46
+ return result;
47
+ }
48
+ /**
49
+ * Creates a partial data object record from form data. The name property is mapped
50
+ * to field name.
51
+ *
52
+ * @param form HTML form element to get FormData from
53
+ * @param dataObject Data object for which to create a record from the form data
54
+ * @returns {Partial<T>} Partial data object record
55
+ */
56
+ export function formDataToDataObjectRecord(form, dataObject) {
57
+ let fields = dataObject.getFields();
58
+ let types = Object.fromEntries(fields.map((field) => [field.name, field.type]));
59
+ return formDataToObject(form, types);
60
+ }
61
+ /**
62
+ * Creates procedure parameters from form data. The name property is mapped
63
+ * to parameter names.
64
+ *
65
+ * @param form HTML Form element to get FormData from
66
+ * @param procedure Appframe Procedure to create parameters for
67
+ * @returns
68
+ */
69
+ export function formDataToProcedureParameters(form, procedure) {
70
+ let parameters = procedure.getParameters();
71
+ let types = Object.fromEntries(parameters.map((param) => [param.name, param.type]));
72
+ return formDataToObject(form, types);
73
+ }
package/es/index.d.ts CHANGED
@@ -4,4 +4,6 @@ export { getLocalizedString } from "./getLocalizedString.js";
4
4
  export { default as localStorage } from "./localStorage.js";
5
5
  export { default as SessionHandler } from "./SessionHandler.js";
6
6
  export { default as UserSession } from "./UserSession.js";
7
+ export { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from "./formDataToObject.js";
8
+ export * from "./settings.js";
7
9
  export declare const version: string;
package/es/index.js CHANGED
@@ -4,4 +4,6 @@ export { getLocalizedString } from "./getLocalizedString.js";
4
4
  export { default as localStorage } from "./localStorage.js";
5
5
  export { default as SessionHandler } from "./SessionHandler.js";
6
6
  export { default as UserSession } from "./UserSession.js";
7
- export const version = "1.0.2";
7
+ export { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from "./formDataToObject.js";
8
+ export * from "./settings.js";
9
+ export const version = "1.1.1";
package/es/warn.js CHANGED
@@ -1,12 +1,4 @@
1
1
  /* eslint-disable no-console */
2
2
  export default function warn(message, fallbackToAlert) {
3
- if (console && typeof console.warn === "function") {
4
- console.warn(message);
5
- }
6
- else if (console && typeof console.log === "function") {
7
- console.log(message);
8
- }
9
- else if (fallbackToAlert) {
10
- alert(message);
11
- }
3
+ console.warn(message);
12
4
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olenbetong/appframe-core",
3
- "version": "1.0.2",
3
+ "version": "1.1.1",
4
4
  "description": "Javascript libraries to utilize the Appframe framework",
5
5
  "type": "module",
6
6
  "main": "./es/index.js",
@@ -35,5 +35,5 @@
35
35
  "devDependencies": {
36
36
  "chalk": "^5.0.1"
37
37
  },
38
- "gitHead": "f7d752c4547e6f17d91fa83717175cd21d90b05f"
38
+ "gitHead": "2fcc10369164e8ce8ad9ce14004da02ab04f5a85"
39
39
  }
@@ -0,0 +1,80 @@
1
+ import type { DataObject, Procedure } from "@olenbetong/appframe-data";
2
+
3
+ function getFormValue(value: string, type: string): string | number | boolean | Date | BigInt | null | undefined {
4
+ if (value === "") {
5
+ return null;
6
+ } else if (type === "number") {
7
+ let numValue = Number(value);
8
+
9
+ return isNaN(numValue) ? undefined : numValue;
10
+ } else if (["date", "datetime", "time"].includes(type)) {
11
+ let dateValue = new Date(value);
12
+
13
+ return isNaN(dateValue.getTime()) ? undefined : dateValue;
14
+ } else if (type === "boolean") {
15
+ return value.toLowerCase() === "true";
16
+ } else if (type === "bigint") {
17
+ return BigInt(value);
18
+ }
19
+
20
+ return value;
21
+ }
22
+
23
+ /**
24
+ * Creates an object from form data. Uses the type map passed to convert the form values to the correct type.
25
+ * @param form HTML form element to get form data from.
26
+ * @param typeMap A mapping from field name to field type
27
+ * @returns
28
+ */
29
+ export function formDataToObject<T = any>(form: HTMLFormElement, typeMap: Record<string, string> = {}): Partial<T> {
30
+ let formData = new FormData(form);
31
+ let result: any = {};
32
+
33
+ for (let entry of formData.entries()) {
34
+ let field = entry[0];
35
+ let type = typeMap?.[field] ?? "string";
36
+ let value = getFormValue(entry[1] as string, type);
37
+
38
+ if (result.hasOwnProperty(field)) {
39
+ if (Array.isArray(result[field])) {
40
+ result[field].push(value);
41
+ } else {
42
+ result[field] = [result[field], value];
43
+ }
44
+ } else {
45
+ result[field] = value;
46
+ }
47
+ }
48
+
49
+ return result as T;
50
+ }
51
+
52
+ /**
53
+ * Creates a partial data object record from form data. The name property is mapped
54
+ * to field name.
55
+ *
56
+ * @param form HTML form element to get FormData from
57
+ * @param dataObject Data object for which to create a record from the form data
58
+ * @returns {Partial<T>} Partial data object record
59
+ */
60
+ export function formDataToDataObjectRecord<T>(form: HTMLFormElement, dataObject: DataObject<T>): Partial<T> {
61
+ let fields = dataObject.getFields();
62
+ let types = Object.fromEntries(fields.map((field) => [field.name, field.type])) as Record<string, string>;
63
+
64
+ return formDataToObject<T>(form, types);
65
+ }
66
+
67
+ /**
68
+ * Creates procedure parameters from form data. The name property is mapped
69
+ * to parameter names.
70
+ *
71
+ * @param form HTML Form element to get FormData from
72
+ * @param procedure Appframe Procedure to create parameters for
73
+ * @returns
74
+ */
75
+ export function formDataToProcedureParameters<T>(form: HTMLFormElement, procedure: Procedure<T, any>): T {
76
+ let parameters = procedure.getParameters();
77
+ let types = Object.fromEntries(parameters.map((param) => [param.name, param.type])) as Record<string, string>;
78
+
79
+ return formDataToObject(form, types) as T;
80
+ }
package/src/index.ts CHANGED
@@ -4,4 +4,6 @@ export { getLocalizedString } from "./getLocalizedString.js";
4
4
  export { default as localStorage } from "./localStorage.js";
5
5
  export { default as SessionHandler } from "./SessionHandler.js";
6
6
  export { default as UserSession } from "./UserSession.js";
7
+ export { formDataToDataObjectRecord, formDataToObject, formDataToProcedureParameters } from "./formDataToObject.js";
8
+ export * from "./settings.js";
7
9
  export const version = __VERSION__;
package/src/warn.ts CHANGED
@@ -1,10 +1,4 @@
1
1
  /* eslint-disable no-console */
2
2
  export default function warn(message: string, fallbackToAlert?: boolean) {
3
- if (console && typeof console.warn === "function") {
4
- console.warn(message);
5
- } else if (console && typeof console.log === "function") {
6
- console.log(message);
7
- } else if (fallbackToAlert) {
8
- alert(message);
9
- }
3
+ console.warn(message);
10
4
  }