1import { parseLinkFilters } from "@opendesk/shared/utils";
2
3// ps: used to be form customizations but now is formScripts is extracted to shared module in formScripts.ts
4export function parseField(field, doc) {
5 return {
6 display_via_depends_on: evaluateDependsOnValue(field?.depends_on, doc),
7 ...field,
8 required:
9 field.required ||
10 (field.mandatory_depends_on &&
11 evaluateDependsOnValue(field.mandatory_depends_on, doc)),
12 filters: field.link_filters && parseLinkFilters(field.link_filters),
13 disabled: field.disabled,
14 readonly:
15 field.readonly ||
16 (field.read_only_depends_on &&
17 evaluateDependsOnValue(field.read_only_depends_on, doc)),
18 };
19}
20
21export function evaluateDependsOnValue(expression, doc) {
22 if (!expression) return true;
23 let out = null;
24 if (expression.substr(0, 5) == "eval:") {
25 try {
26 out = _eval(expression.substr(5), { doc });
27 } catch (e) {
28 out = true;
29 }
30 } else if (expression.substr(0, 4) == "doc.") {
31 out = doc[expression.substr(4)];
32 } else {
33 let value = doc[expression];
34 if (Array.isArray(value)) {
35 out = !!value.length;
36 } else {
37 out = !!value;
38 }
39 }
40 return out;
41}
42function _eval(code, context = {}) {
43 let variable_names = Object.keys(context);
44 let variables = Object.values(context);
45 code = `let out = ${code}; return out`;
46 try {
47 let expression_function = new Function(...variable_names, code);
48 return expression_function(...variables);
49 } catch (error) {
50 console.error("Could not evaluate depends_on:", code);
51 throw error;
52 }
53}
54