1 | function stringToNumber(value) {
|
2 | if (!value) {
|
3 | return value;
|
4 | }
|
5 |
|
6 | if (typeof value === "string") {
|
7 | value = value.replace(",", ".");
|
8 | value = value.replace("−", "-");
|
9 | value = Number(value);
|
10 | }
|
11 |
|
12 | return value;
|
13 | }
|
14 |
|
15 | function getFormValue(value, type) {
|
16 | if (value === "") {
|
17 | return null;
|
18 | } else if (type === "number") {
|
19 | let numValue = stringToNumber(value);
|
20 |
|
21 | return isNaN(numValue) ? undefined : numValue;
|
22 | } else if (["date", "datetime"].includes(type)) {
|
23 | let dateValue = new Date(value);
|
24 |
|
25 | return isNaN(dateValue.getTime()) ? undefined : dateValue;
|
26 | } else if (type === "boolean") {
|
27 | return value.toLowerCase() === "true";
|
28 | }
|
29 |
|
30 | return value;
|
31 | }
|
32 |
|
33 | export function formDataToObject(form, typeMap = {}) {
|
34 | let formData = new FormData(form);
|
35 | let result = new Map();
|
36 |
|
37 | for (let [field, value] of formData.entries()) {
|
38 | let type = typeMap?.[field] ?? "string";
|
39 | value = getFormValue(value, type);
|
40 |
|
41 | if (result.has(field)) {
|
42 | let current = result.get(field);
|
43 |
|
44 | if (Array.isArray(current)) {
|
45 | current.push(value);
|
46 | } else {
|
47 | result.set(field, [current, value]);
|
48 | }
|
49 | } else {
|
50 | result.set(field, value);
|
51 | }
|
52 | }
|
53 |
|
54 | return Object.fromEntries(result);
|
55 | }
|
56 |
|
57 | export function formDataToProcedureParameters(form, procedure) {
|
58 | let parameters = procedure.getParameters();
|
59 | let types = Object.fromEntries(parameters.map(param => [param.name, param.type]));
|
60 |
|
61 | return formDataToObject(form, types);
|
62 | }
|