feat: display depends on in settings page

This commit is contained in:
Shariq Ansari 2024-09-13 12:28:43 +05:30
parent ee12e3b3fd
commit 6322ad268c
4 changed files with 55 additions and 3 deletions

View File

@ -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

View File

@ -23,9 +23,11 @@
<div v-for="field in section.fields" :key="field.name">
<div
v-if="
field.type == 'Check' ||
(field.read_only && data[field.name]) ||
!field.read_only || !field.hidden
(field.type == 'Check' ||
(field.read_only && data[field.name]) ||
!field.read_only ||
!field.hidden) &&
field.display_depends_on
"
>
<div

View File

@ -37,6 +37,7 @@ import {
Spinner,
Badge,
} from 'frappe-ui'
import { evaluate_depends_on_value } from '@/utils'
import { computed } from 'vue'
const props = defineProps({
@ -90,6 +91,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,
})
}

View File

@ -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
}