diff --git a/crm/api/doc.py b/crm/api/doc.py index aeb76a6f..a5a7c51e 100644 --- a/crm/api/doc.py +++ b/crm/api/doc.py @@ -682,6 +682,9 @@ def get_fields(doctype: str, allow_all_fieldtypes: bool = False): "mandatory": field.reqd, "read_only": field.read_only, "hidden": field.hidden, + "depends_on": field.depends_on, + "mandatory_depends_on": field.mandatory_depends_on, + "read_only_depends_on": field.read_only_depends_on, }) return _fields diff --git a/frontend/src/components/Fields.vue b/frontend/src/components/Fields.vue index fe723d8b..80cea4ba 100644 --- a/frontend/src/components/Fields.vue +++ b/frontend/src/components/Fields.vue @@ -23,9 +23,11 @@
{ } else { _sections[_sections.length - 1].fields.push({ ...field, + display_depends_on: evaluate_depends_on_value( + field.depends_on, + data.doc, + ), name: field.value, }) } diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.js index f7cbbd0c..c233668d 100644 --- a/frontend/src/utils/index.js +++ b/frontend/src/utils/index.js @@ -241,3 +241,45 @@ export function isTouchScreenDevice() { export function convertArrayToString(array) { return array.map((item) => item).join(',') } + +export function _eval(code, context = {}) { + let variable_names = Object.keys(context) + let variables = Object.values(context) + code = `let out = ${code}; return out` + try { + let expression_function = new Function(...variable_names, code) + return expression_function(...variables) + } catch (error) { + console.log('Error evaluating the following expression:') + console.error(code) + throw error + } +} + +export function evaluate_depends_on_value(expression, doc) { + if (!expression) return true + if (!doc) return true + + let out = null + + if (typeof expression === 'boolean') { + out = expression + } else if (typeof expression === 'function') { + out = expression(doc) + } else if (expression.substr(0, 5) == 'eval:') { + try { + out = _eval(expression.substr(5), { doc }) + } catch (e) { + out = true + } + } else { + let value = doc[expression] + if (Array.isArray(value)) { + out = !!value.length + } else { + out = !!value + } + } + + return out +} \ No newline at end of file