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 @@
diff --git a/frontend/src/components/Settings/SettingsPage.vue b/frontend/src/components/Settings/SettingsPage.vue index d8949bdc..3d73917d 100644 --- a/frontend/src/components/Settings/SettingsPage.vue +++ b/frontend/src/components/Settings/SettingsPage.vue @@ -37,6 +37,7 @@ import { Spinner, Badge, } from 'frappe-ui' +import { evaluate_depends_on_value, createToast } from '@/utils' import { computed } from 'vue' const props = defineProps({ @@ -44,6 +45,10 @@ const props = defineProps({ type: String, required: true, }, + successMessage: { + type: String, + default: 'Updated Successfully', + }, }) const fields = createResource({ @@ -62,6 +67,24 @@ const data = createDocumentResource({ fields: ['*'], cache: props.doctype, auto: true, + setValue: { + onSuccess: () => { + createToast({ + title: __('Success'), + text: __(props.successMessage), + icon: 'check', + iconClasses: 'text-green-600', + }) + }, + onError: (err) => { + createToast({ + title: __('Error'), + text: err.message + ': ' + err.messages[0], + icon: 'x', + iconClasses: 'text-red-600', + }) + }, + }, }) const sections = computed(() => { @@ -90,6 +113,10 @@ const sections = computed(() => { } 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