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