@olenbetong/appframe-core 1.3.1 → 1.3.4

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.
@@ -0,0 +1,698 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key2, value) => key2 in obj ? __defProp(obj, key2, { enumerable: true, configurable: true, writable: true, value }) : obj[key2] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+
18
+ // src/errorHandler.ts
19
+ window.addEventListener("error", (event) => {
20
+ var _a, _b, _c, _d, _e, _f, _g;
21
+ try {
22
+ const data = {
23
+ error: (_c = (_b = (_a = event.error) == null ? void 0 : _a.message) != null ? _b : event.message) != null ? _c : null,
24
+ file: event.filename,
25
+ line: (_d = event.lineno) != null ? _d : 0,
26
+ column: (_e = event.colno) != null ? _e : 0,
27
+ stack: (_g = (_f = event.error) == null ? void 0 : _f.stack) != null ? _g : null
28
+ };
29
+ fetch("/data/Logger/LogError", {
30
+ body: JSON.stringify(data),
31
+ headers: {
32
+ Accept: "application/json",
33
+ "Content-Type": "application/json; charset=utf-8",
34
+ "X-Requested-With": "XMLHttpRequest"
35
+ },
36
+ method: "POST"
37
+ });
38
+ } catch (ex) {
39
+ }
40
+ });
41
+
42
+ // ../../node_modules/mitt/dist/mitt.mjs
43
+ function mitt_default(n) {
44
+ return { all: n = n || /* @__PURE__ */ new Map(), on: function(t, e) {
45
+ var i = n.get(t);
46
+ i ? i.push(e) : n.set(t, [e]);
47
+ }, off: function(t, e) {
48
+ var i = n.get(t);
49
+ i && (e ? i.splice(i.indexOf(e) >>> 0, 1) : n.set(t, []));
50
+ }, emit: function(t, e) {
51
+ var i = n.get(t);
52
+ i && i.slice().map(function(n2) {
53
+ n2(e);
54
+ }), (i = n.get("*")) && i.slice().map(function(n2) {
55
+ n2(t, e);
56
+ });
57
+ } };
58
+ }
59
+
60
+ // src/downloadBlob.ts
61
+ function downloadBlob(blob, fileName) {
62
+ return new Promise(function(resolve, reject) {
63
+ try {
64
+ const url = URL.createObjectURL(blob);
65
+ const parent = document.body;
66
+ const anchor = document.createElement("a");
67
+ anchor.setAttribute("download", fileName);
68
+ anchor.href = url;
69
+ parent.append(anchor);
70
+ anchor.click();
71
+ parent.removeChild(anchor);
72
+ setTimeout(function() {
73
+ URL.revokeObjectURL(url);
74
+ resolve();
75
+ }, 250);
76
+ } catch (ex) {
77
+ reject(ex);
78
+ }
79
+ });
80
+ }
81
+
82
+ // src/downloadRequest.ts
83
+ async function downloadRequest(request, { fileName, signal, onProgress }) {
84
+ var _a;
85
+ function reportProgress(progress) {
86
+ if (typeof onProgress === "function") {
87
+ onProgress(__spreadValues({}, progress));
88
+ }
89
+ }
90
+ let bytesReceived = 0;
91
+ reportProgress({ status: "requested" });
92
+ try {
93
+ let response = await fetch(request);
94
+ if (!response.ok || !response.body) {
95
+ if ((_a = response.headers.get("content-type")) == null ? void 0 : _a.includes("application/json")) {
96
+ let data = await response.json();
97
+ if (data.error) {
98
+ throw new Error(data.error);
99
+ }
100
+ }
101
+ throw new Error(`${response.status} ${response.statusText}`);
102
+ }
103
+ try {
104
+ const reader = response.body.getReader();
105
+ const stream = new ReadableStream({
106
+ start: function(controller) {
107
+ function pump() {
108
+ return reader.read().then(function(read) {
109
+ if (read.done) {
110
+ controller.close();
111
+ return;
112
+ }
113
+ bytesReceived += read.value.length;
114
+ reportProgress({ bytesReceived, status: "downloading" });
115
+ controller.enqueue(read.value);
116
+ return pump();
117
+ });
118
+ }
119
+ return pump();
120
+ }
121
+ });
122
+ response = new Response(stream);
123
+ } catch (error) {
124
+ console.warn("Failed to replace response stream to log download progress.");
125
+ }
126
+ const blob = await response.blob();
127
+ reportProgress({ bytesReceived, status: "downloaded" });
128
+ await downloadBlob(blob, fileName);
129
+ reportProgress({ bytesReceived, status: "completed" });
130
+ } catch (err) {
131
+ if (signal == null ? void 0 : signal.aborted) {
132
+ reportProgress({ status: "cancelled" });
133
+ } else {
134
+ reportProgress({ error: err.message, status: "error" });
135
+ }
136
+ }
137
+ }
138
+
139
+ // src/exportDataObject.ts
140
+ function exportOptionsFromDataObject(dataObject, specifiedOptions) {
141
+ return __spreadValues({
142
+ columns: dataObject.getFields().map((field) => ({ name: field.name })),
143
+ distinctRows: dataObject.getParameter("distinctRows"),
144
+ filterObject: dataObject.getParameter("filterObject"),
145
+ filterString: dataObject.getParameter("filterString"),
146
+ maxRecords: dataObject.getParameter("maxRecords"),
147
+ sortOrder: dataObject.getParameter("sortOrder"),
148
+ whereClause: dataObject.getParameter("whereClause"),
149
+ whereObject: dataObject.getParameter("whereObject")
150
+ }, specifiedOptions);
151
+ }
152
+ var defaultOptions = {
153
+ columns: [],
154
+ distinctRows: false,
155
+ filterObject: null,
156
+ filterString: "",
157
+ maxRecords: -1,
158
+ sortOrder: [],
159
+ whereClause: "",
160
+ whereObject: null
161
+ };
162
+ function getDataObjectReportRequest(params) {
163
+ var _a;
164
+ const { articleId, dataObject, format, options } = params;
165
+ const reportOptions = options ? Object.assign({}, defaultOptions, options) : defaultOptions;
166
+ const body = "data=" + encodeURIComponent(JSON.stringify(reportOptions));
167
+ const requestUrl = `/api/data-object/export/${articleId}/${dataObject}/${format}`;
168
+ const controller = (_a = params.controller) != null ? _a : new AbortController();
169
+ return {
170
+ controller,
171
+ request: new Request(requestUrl, {
172
+ body,
173
+ credentials: "same-origin",
174
+ headers: {
175
+ "Content-Type": "application/x-www-form-urlencoded"
176
+ },
177
+ method: "POST",
178
+ signal: controller.signal
179
+ })
180
+ };
181
+ }
182
+ function openDataObjectReport(params) {
183
+ const { dataObject, fileName, format } = params;
184
+ const { request } = getDataObjectReportRequest(params);
185
+ return downloadRequest(request, {
186
+ fileName: `${fileName || dataObject}.${format}`
187
+ });
188
+ }
189
+
190
+ // src/has.ts
191
+ function has(obj, key2) {
192
+ return Object.prototype.hasOwnProperty.call(obj, key2);
193
+ }
194
+
195
+ // src/parseFunc.ts
196
+ var 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)*)\}$/;
197
+ function parseFunc(func) {
198
+ var match = func.toString().match(funcRegex);
199
+ if (match === null) {
200
+ throw new TypeError("Unable to parse function!");
201
+ }
202
+ return { name: match[1], args: match[2].split(","), body: match[3] };
203
+ }
204
+
205
+ // src/Namespace.ts
206
+ function Namespace() {
207
+ }
208
+ Namespace.prototype = /* @__PURE__ */ Object.create(null);
209
+ var Namespace_default = Namespace;
210
+
211
+ // src/requireNamespace.ts
212
+ function requireNamespace(root, namespace) {
213
+ if (typeof root === "object") {
214
+ if (typeof namespace === "string") {
215
+ let path = namespace.split(".");
216
+ return requireNamespace(root, path);
217
+ } else if (Array.isArray(namespace)) {
218
+ let current = root;
219
+ for (let i = 0; i < namespace.length; i++) {
220
+ current = current[namespace[i]] = current[namespace[i]] || new Namespace_default();
221
+ }
222
+ return current;
223
+ } else {
224
+ throw new TypeError("Invalid type of parameter 'namespace'");
225
+ }
226
+ } else {
227
+ throw new TypeError("Invalid type of parameter 'root'");
228
+ }
229
+ }
230
+
231
+ // src/warn.ts
232
+ function warn(message, fallbackToAlert) {
233
+ console.warn(message);
234
+ }
235
+
236
+ // src/expose.ts
237
+ function expose(name, value) {
238
+ if (arguments.length !== 2) {
239
+ throw new Error("Incorrect number of arguments passed to the expose function!");
240
+ }
241
+ if (Array.isArray(value)) {
242
+ for (let func of value) {
243
+ const { name: funcName } = parseFunc(func);
244
+ if (funcName) {
245
+ expose(name, func);
246
+ } else {
247
+ throw new Error(
248
+ "Unable to detect name of function! Name it, or only supply one function and include name in first parameter."
249
+ );
250
+ }
251
+ }
252
+ } else {
253
+ let keyName;
254
+ let namespace;
255
+ if (typeof value === "function") {
256
+ keyName = parseFunc(value).name;
257
+ }
258
+ if (typeof name === "string") {
259
+ let pathParts = name.split(".");
260
+ if (!keyName) {
261
+ keyName = pathParts[pathParts.length - 1];
262
+ pathParts = pathParts.slice(0, pathParts.length - 1);
263
+ }
264
+ namespace = requireNamespace(window, pathParts);
265
+ } else if (keyName && (typeof name === "object" || typeof name === "function")) {
266
+ namespace = name;
267
+ } else {
268
+ throw new TypeError("Invalid typeof parameter 'name', or unable to parse pValue!");
269
+ }
270
+ if (has(namespace, keyName)) {
271
+ warn([name, keyName].join(".") + " is already defined!");
272
+ } else {
273
+ namespace[keyName] = value;
274
+ }
275
+ }
276
+ }
277
+
278
+ // src/getLocalizedString.ts
279
+ async function getLocalizedStringAsync(string) {
280
+ try {
281
+ let response = await fetch("/api/user/localize", {
282
+ body: JSON.stringify({ string }),
283
+ headers: {
284
+ Accept: "application/json; */*",
285
+ "Content-Type": "application/json",
286
+ "X-Requested-With": "XMLHttpRequest"
287
+ },
288
+ method: "POST"
289
+ });
290
+ if (response.ok) {
291
+ return await response.json();
292
+ }
293
+ } catch (error) {
294
+ }
295
+ return string;
296
+ }
297
+ function afGetLocalizedString(string, wait) {
298
+ var _a;
299
+ if (((_a = af == null ? void 0 : af.article) == null ? void 0 : _a.i18n) !== void 0) {
300
+ if (!Object.prototype.hasOwnProperty.call(af.article.i18n, string)) {
301
+ af.article.i18n[string] = string;
302
+ let promise = getLocalizedStringAsync(string).then((text) => {
303
+ af.article.i18n[string] = text;
304
+ return text;
305
+ });
306
+ if (wait) {
307
+ return promise;
308
+ }
309
+ }
310
+ return af.article.i18n[string];
311
+ } else {
312
+ return string;
313
+ }
314
+ }
315
+ var key = "__UNLOCALIZED_STRINGS__";
316
+ var localizeSet = window[key] || /* @__PURE__ */ new Set();
317
+ if (!window[key]) {
318
+ window[key] = localizeSet;
319
+ }
320
+ function handleReadyStateChange() {
321
+ if (document.readyState !== "loading") {
322
+ addDeveloperUtils();
323
+ document.removeEventListener("readystatechange", handleReadyStateChange);
324
+ }
325
+ }
326
+ if (document.readyState !== "loading") {
327
+ addDeveloperUtils();
328
+ } else {
329
+ document.addEventListener("readystatechange", handleReadyStateChange);
330
+ }
331
+ function isDeveloper() {
332
+ const { af: af2 } = window;
333
+ return af2 && af2.userSession && af2.userSession.isDeveloper;
334
+ }
335
+ function addDeveloperUtils() {
336
+ if (isDeveloper()) {
337
+ if (typeof window.__doNothingWithStrings === "function") {
338
+ const addedStrings = window.__doNothingWithStrings();
339
+ for (let string of Object.keys(addedStrings)) {
340
+ localizeSet.add(string);
341
+ }
342
+ }
343
+ if (!window[key]) {
344
+ window[key] = localizeSet;
345
+ }
346
+ if (!window.__getUnlocalizedStrings) {
347
+ window.__getUnlocalizedStrings = function(forCustomRoute) {
348
+ const strings = [];
349
+ for (let string of localizeSet) {
350
+ if (string) {
351
+ const escaped = string.replace(/'/g, "\\'");
352
+ if (forCustomRoute) {
353
+ const localized = afGetLocalizedString(string).replaceAll(
354
+ /'/g,
355
+ "\\'"
356
+ );
357
+ strings.push(`'${escaped}': '${localized}',`);
358
+ } else {
359
+ strings.push(
360
+ `s['${escaped}'] = @Html(@context.AddLocalizableString("${string.replaceAll(
361
+ '"',
362
+ '\\"'
363
+ )}"));`
364
+ );
365
+ }
366
+ }
367
+ }
368
+ if (forCustomRoute) {
369
+ return `// Localization hack, since it AddLocalizableString doesn't work properly when custom routes is used
370
+ if (af.userSession.uiculture === 'nb-NO') {
371
+ const strings = {
372
+ ${strings.join("\n ")}
373
+ };
374
+ af.article.i18n = af.article.i18n || {};
375
+ Object.assign(af.article.i18n, strings);
376
+ }`;
377
+ }
378
+ return `<script type="text/javascript">
379
+ function __doNothingWithStrings() {
380
+ @{
381
+ var context = @Appframe.Web.Context.RequestContext.Current;
382
+ }
383
+ let s = {};
384
+ ${strings.join("\n")}
385
+ return s;
386
+ }
387
+ <\/script>`;
388
+ };
389
+ }
390
+ }
391
+ }
392
+ function getLocalizedString(string) {
393
+ const localized = afGetLocalizedString(string);
394
+ if (localized === string && !localizeSet.has(string)) {
395
+ localizeSet.add(string);
396
+ }
397
+ return localized;
398
+ }
399
+
400
+ // src/localStorage.ts
401
+ function getLocalKey(key2) {
402
+ var _a;
403
+ return [((_a = af == null ? void 0 : af.article) == null ? void 0 : _a.id) || "", "common", key2].join(".");
404
+ }
405
+ var LocalStorage = class {
406
+ isPersisted() {
407
+ return true;
408
+ }
409
+ getLocalStorageKey(key2, global) {
410
+ return global ? ["common", key2].join(".") : getLocalKey(key2);
411
+ }
412
+ get(key2, defaultValue, global) {
413
+ const lsKey = this.getLocalStorageKey(key2, global);
414
+ const value = localStorage.getItem(lsKey);
415
+ return value !== null ? JSON.parse(value) : defaultValue;
416
+ }
417
+ set(key2, value, global) {
418
+ localStorage.setItem(
419
+ this.getLocalStorageKey(key2, global),
420
+ JSON.stringify(value)
421
+ );
422
+ }
423
+ remove(key2, global) {
424
+ const lsKey = this.getLocalStorageKey(key2, global);
425
+ if (localStorage.getItem(lsKey) !== null) {
426
+ localStorage.removeItem(lsKey);
427
+ return true;
428
+ } else {
429
+ return false;
430
+ }
431
+ }
432
+ clear() {
433
+ const baseKey = getLocalKey("");
434
+ for (let key2 in localStorage) {
435
+ if (key2.slice(0, baseKey.length) === baseKey) {
436
+ localStorage.removeItem(key2);
437
+ }
438
+ }
439
+ }
440
+ };
441
+ var localStorage_default = new LocalStorage();
442
+
443
+ // src/SessionHandler.ts
444
+ var _SessionHandler = class {
445
+ constructor() {
446
+ this.eventHandler = mitt_default();
447
+ this.showingDialog = false;
448
+ this.dialog = null;
449
+ }
450
+ expired(callback) {
451
+ af.userSession = af.userSession || {
452
+ login: null
453
+ };
454
+ if (typeof callback !== "function") {
455
+ throw new TypeError("Parameter pCallback passed to the expired function must be a function!");
456
+ }
457
+ const once = () => {
458
+ this.detachEvent("onAuthenticated", once);
459
+ callback();
460
+ };
461
+ this.attachEvent("onAuthenticated", once);
462
+ if (this.showingDialog !== true) {
463
+ this.showingDialog = true;
464
+ const contentContainer = document.createElement("div");
465
+ contentContainer.className = "session-expired-container";
466
+ contentContainer.innerHTML = `
467
+ <div class="session-expired-log-in" style="margin-top: 20px;">
468
+ <div class="row">
469
+ <div class="sessionExpired">
470
+ <h4 class="message">Frakoblet - tidsavbrudd</h4>
471
+ <div class="form-group">
472
+ <label for="username">${getLocalizedString("Username")}</label>
473
+ <input type="text" class="form-control" id="username" autofocus>
474
+ </div>
475
+ <div class="form-group">
476
+ <label for="password">${getLocalizedString("Password")}</label>
477
+ <input type="password" autocomplete="password" class="form-control" id="password" >
478
+ </div>
479
+ <div class="form-group">
480
+ <div>
481
+ <button type="submit" class="btn btn-default sign-in">
482
+ ${getLocalizedString("Log in")}
483
+ </button>
484
+ </div>
485
+ </div>
486
+ </div>
487
+ </div>
488
+ <div class="row">
489
+ <div class="" style="display:none; margin: 0px 30px;">
490
+ <div class="alert alert-warning" role="alert" style="margin-top:10px;"></div>
491
+ </div>
492
+ </div>
493
+ </div>
494
+ `;
495
+ const message = af.userSession.login ? _SessionHandler.messages.relog : _SessionHandler.messages.login;
496
+ const messageElem = contentContainer.querySelector(".message");
497
+ const statusElem = contentContainer.querySelector(".alert-warning");
498
+ const userElem = contentContainer.querySelector("input[type=text]");
499
+ const signInElem = contentContainer.querySelector(".sign-in");
500
+ const passwordElem = contentContainer.querySelector("input[type=password]");
501
+ if (messageElem !== null && userElem !== null && statusElem !== null && userElem !== null && signInElem !== null && passwordElem !== null) {
502
+ messageElem.innerText = getLocalizedString(message);
503
+ userElem.value = af.userSession.login || "";
504
+ userElem.disabled = !!af.userSession.login;
505
+ userElem.readOnly = !!af.userSession.login;
506
+ document.body.appendChild(contentContainer);
507
+ const doLogin = async () => {
508
+ passwordElem.disabled = true;
509
+ const request = new Request("/login", {
510
+ body: JSON.stringify({
511
+ username: userElem.value,
512
+ password: passwordElem.value,
513
+ remember: false
514
+ }),
515
+ headers: {
516
+ Accept: "application/json",
517
+ "Content-Type": "application/json; charset=utf-8",
518
+ "X-Requested-With": "XMLHttpRequest"
519
+ },
520
+ method: "POST"
521
+ });
522
+ try {
523
+ const response = await fetch(request);
524
+ const json = await response.json();
525
+ if (json.success) {
526
+ document.body.removeChild(contentContainer);
527
+ this.showingDialog = false;
528
+ this.eventHandler.emit("onAuthenticated");
529
+ if (statusElem.parentNode) {
530
+ statusElem.parentNode.style.display = "none";
531
+ }
532
+ } else {
533
+ throw new Error(json.error);
534
+ }
535
+ } catch (err) {
536
+ if (err && typeof err === "object") {
537
+ let error = err;
538
+ passwordElem.disabled = false;
539
+ passwordElem.classList.toggle("invalid", true);
540
+ passwordElem.value = "";
541
+ passwordElem.focus();
542
+ statusElem.innerText = error.message ? error.message : String(error);
543
+ if (statusElem.parentNode) {
544
+ statusElem.parentNode.style.display = "initial";
545
+ }
546
+ }
547
+ }
548
+ };
549
+ signInElem.addEventListener("click", doLogin);
550
+ passwordElem.addEventListener("keyup", (evt) => {
551
+ if (evt.key === "Enter") {
552
+ doLogin();
553
+ }
554
+ });
555
+ passwordElem.addEventListener("change", (evt) => {
556
+ if (evt.key === "Enter") {
557
+ doLogin();
558
+ }
559
+ });
560
+ userElem.addEventListener("keyup", (evt) => {
561
+ if (evt.key === "Enter") {
562
+ doLogin();
563
+ }
564
+ });
565
+ userElem.addEventListener("change", (evt) => {
566
+ if (evt.key === "Enter") {
567
+ doLogin();
568
+ }
569
+ });
570
+ passwordElem.focus();
571
+ }
572
+ }
573
+ }
574
+ attachEvent(eventName, handler) {
575
+ return this.eventHandler.on(eventName, handler);
576
+ }
577
+ detachEvent(eventName, handler) {
578
+ return this.eventHandler.off(eventName, handler);
579
+ }
580
+ };
581
+ var SessionHandler = _SessionHandler;
582
+ SessionHandler.messages = {
583
+ login: "Log in",
584
+ relog: "Session expired - log in"
585
+ };
586
+
587
+ // src/UserSession.ts
588
+ var UserSession = class extends SessionHandler {
589
+ constructor(userData) {
590
+ super();
591
+ this.decimalSeparator = ".";
592
+ this.groupSeparator = null;
593
+ this.shortDateFormat = "dd.MM.yyyy";
594
+ this.login = null;
595
+ this.isDeveloper = false;
596
+ this.formats = {};
597
+ Object.assign(this, userData);
598
+ }
599
+ };
600
+
601
+ // src/formDataToObject.ts
602
+ function getFormValue(value, type) {
603
+ if (value === "") {
604
+ return null;
605
+ } else if (type === "number") {
606
+ let numValue = Number(value);
607
+ return isNaN(numValue) ? void 0 : numValue;
608
+ } else if (["date", "datetime", "time"].includes(type)) {
609
+ let dateValue = new Date(value);
610
+ return isNaN(dateValue.getTime()) ? void 0 : dateValue;
611
+ } else if (type === "boolean") {
612
+ return value.toLowerCase() === "true";
613
+ } else if (type === "bigint") {
614
+ return BigInt(value);
615
+ }
616
+ return value;
617
+ }
618
+ function formDataToObject(form, typeMap = {}) {
619
+ var _a;
620
+ let formData = new FormData(form);
621
+ let result = {};
622
+ for (let entry of formData.entries()) {
623
+ let field = entry[0];
624
+ let type = (_a = typeMap == null ? void 0 : typeMap[field]) != null ? _a : "string";
625
+ let value = getFormValue(entry[1], type);
626
+ if (result.hasOwnProperty(field)) {
627
+ if (Array.isArray(result[field])) {
628
+ result[field].push(value);
629
+ } else {
630
+ result[field] = [result[field], value];
631
+ }
632
+ } else {
633
+ result[field] = value;
634
+ }
635
+ }
636
+ return result;
637
+ }
638
+ function formDataToDataObjectRecord(form, dataObject) {
639
+ let fields = dataObject.getFields();
640
+ let types = Object.fromEntries(fields.map((field) => [field.name, field.type]));
641
+ return formDataToObject(form, types);
642
+ }
643
+ function formDataToProcedureParameters(form, procedure) {
644
+ let parameters = procedure.getParameters();
645
+ let types = Object.fromEntries(parameters.map((param) => [param.name, param.type]));
646
+ return formDataToObject(form, types);
647
+ }
648
+
649
+ // src/settings.ts
650
+ function getKey(article) {
651
+ const articleKey = article || af.article.id;
652
+ return `${articleKey}.${af.userSession.login}`;
653
+ }
654
+ function getSettings(setting, article) {
655
+ if (!(af == null ? void 0 : af.userSession))
656
+ return null;
657
+ const key2 = getKey(article);
658
+ const settings = JSON.parse(localStorage.getItem(key2) || "{}");
659
+ if (setting) {
660
+ return settings[setting] || null;
661
+ }
662
+ return settings;
663
+ }
664
+ function saveSettings(setting, value, article) {
665
+ if (!(af == null ? void 0 : af.userSession))
666
+ return;
667
+ const key2 = getKey(article);
668
+ let userSettings = JSON.parse(localStorage.getItem(key2) || "{}");
669
+ if (typeof value !== "undefined") {
670
+ userSettings[setting] = value;
671
+ } else {
672
+ userSettings = setting;
673
+ }
674
+ localStorage.setItem(key2, JSON.stringify(userSettings));
675
+ }
676
+
677
+ // src/index.ts
678
+ var version = "1.3.4";
679
+ export {
680
+ SessionHandler,
681
+ UserSession,
682
+ downloadBlob,
683
+ downloadRequest,
684
+ exportOptionsFromDataObject,
685
+ expose,
686
+ formDataToDataObjectRecord,
687
+ formDataToObject,
688
+ formDataToProcedureParameters,
689
+ getDataObjectReportRequest,
690
+ getLocalizedString,
691
+ getSettings,
692
+ has,
693
+ localStorage_default as localStorage,
694
+ mitt_default as mitt,
695
+ openDataObjectReport,
696
+ saveSettings,
697
+ version
698
+ };