diff --git a/apps/jingrow/frontend/src/core/features/form_builder/FormBuilder.vue b/apps/jingrow/frontend/src/core/features/form_builder/FormBuilder.vue index 90b9606..116c930 100644 --- a/apps/jingrow/frontend/src/core/features/form_builder/FormBuilder.vue +++ b/apps/jingrow/frontend/src/core/features/form_builder/FormBuilder.vue @@ -23,6 +23,10 @@ const props = defineProps({ type: String, default: "" }, + pagetypeRecord: { + type: Object, + default: null + }, readOnly: { type: Boolean, default: false @@ -86,6 +90,7 @@ onMounted(() => { store.initialize(props.fields, { pagetype: props.pagetype, + pg: props.pagetypeRecord, readOnly: props.readOnly, isCustomizeForm: props.isCustomizeForm, }); @@ -97,6 +102,7 @@ watch( (newFields) => { store.initialize(newFields, { pagetype: props.pagetype, + pg: props.pagetypeRecord, readOnly: props.readOnly, isCustomizeForm: props.isCustomizeForm, }); diff --git a/apps/jingrow/frontend/src/core/features/form_builder/components/FieldProperties.vue b/apps/jingrow/frontend/src/core/features/form_builder/components/FieldProperties.vue index 28132cb..89e50f0 100644 --- a/apps/jingrow/frontend/src/core/features/form_builder/components/FieldProperties.vue +++ b/apps/jingrow/frontend/src/core/features/form_builder/components/FieldProperties.vue @@ -17,7 +17,7 @@ let pagefieldDf = computed(() => { } if ( df.depends_on && - !evaluateDependsOnValue(df.depends_on, store.form.selected_field) + !evaluateDependsOnValue(df.depends_on, store.form.selected_field, store.pg) ) { return false; } diff --git a/apps/jingrow/frontend/src/core/features/form_builder/store.js b/apps/jingrow/frontend/src/core/features/form_builder/store.js index c2cf3a0..5afcc35 100644 --- a/apps/jingrow/frontend/src/core/features/form_builder/store.js +++ b/apps/jingrow/frontend/src/core/features/form_builder/store.js @@ -116,7 +116,7 @@ export const DEFAULT_PAGEFIELD_PROPERTIES = [ // Visibility Section { fieldname: "visibility_section", fieldtype: "Section Break", label: t("Visibility") }, { fieldname: "hidden", label: t("Hidden"), fieldtype: "Check" }, - { fieldname: "show_on_timeline", label: t("Show on Timeline"), fieldtype: "Check", depends_on: "eval:doc.hidden" }, + { fieldname: "show_on_timeline", label: t("Show on Timeline"), fieldtype: "Check", depends_on: "eval:pg.hidden" }, { fieldname: "bold", label: t("Bold"), fieldtype: "Check" }, { fieldname: "allow_in_quick_entry", label: t("Allow in Quick Entry"), fieldtype: "Check" }, { fieldname: "translatable", label: t("Translatable"), fieldtype: "Check", depends_on: "eval:['Data', 'Select', 'Text', 'Small Text', 'Text Editor'].includes(pg.fieldtype)" }, @@ -126,7 +126,7 @@ export const DEFAULT_PAGEFIELD_PROPERTIES = [ { fieldname: "column_break_28", fieldtype: "Column Break" }, { fieldname: "depends_on", label: t("Display Depends On (JS)"), fieldtype: "Code", options: "JS" }, { fieldname: "collapsible", label: t("Collapsible"), fieldtype: "Check", depends_on: "eval:pg.fieldtype=='Section Break'" }, - { fieldname: "collapsible_depends_on", label: t("Collapsible Depends On (JS)"), fieldtype: "Code", options: "JS", depends_on: "eval:doc.collapsible" }, + { fieldname: "collapsible_depends_on", label: t("Collapsible Depends On (JS)"), fieldtype: "Code", options: "JS", depends_on: "eval:pg.collapsible" }, { fieldname: "hide_border", label: t("Hide Border"), fieldtype: "Check", depends_on: "eval:pg.fieldtype=='Section Break'" }, // List / Search Settings Section @@ -141,7 +141,7 @@ export const DEFAULT_PAGEFIELD_PROPERTIES = [ // Permissions Section { fieldname: "permissions", fieldtype: "Section Break", label: t("Permissions") }, { fieldname: "read_only", label: t("Read Only"), fieldtype: "Check" }, - { fieldname: "allow_on_submit", label: t("Allow on Submit"), fieldtype: "Check" }, + { fieldname: "allow_on_submit", label: t("Allow on Submit"), fieldtype: "Check", depends_on: "eval:parent.is_submittable" }, { fieldname: "ignore_user_permissions", label: t("Ignore User Permissions"), fieldtype: "Check" }, { fieldname: "allow_bulk_edit", label: t("Allow Bulk Edit"), fieldtype: "Check", depends_on: "eval:pg.fieldtype=='Table'" }, { fieldname: "make_attachment_public", label: t("Make Attachment Public (by default)"), fieldtype: "Check", depends_on: "eval:['Attach', 'Attach Image'].includes(pg.fieldtype)" }, diff --git a/apps/jingrow/frontend/src/core/features/form_builder/utils.js b/apps/jingrow/frontend/src/core/features/form_builder/utils.js index bf3c81b..1dc6fe3 100644 --- a/apps/jingrow/frontend/src/core/features/form_builder/utils.js +++ b/apps/jingrow/frontend/src/core/features/form_builder/utils.js @@ -147,8 +147,11 @@ export function getTableColumns(df, childPagetype) { /** * Evaluate depends_on expression + * @param {string|boolean|function} expression - The depends_on expression + * @param {object} pg - The current field/document being evaluated (usually selected_field) + * @param {object} parent - Optional parent document (usually the PageType record) */ -export function evaluateDependsOnValue(expression, pg) { +export function evaluateDependsOnValue(expression, pg, parent = null) { if (!pg) return false; let out = null; @@ -159,13 +162,13 @@ export function evaluateDependsOnValue(expression, pg) { out = expression(pg); } else if (expression.substr(0, 5) === "eval:") { try { - const doc = pg; // Define in_list function for eval context const in_list = (list, value) => list && list.includes(value); // Simple evaluation for common patterns out = eval(expression.substr(5)); } catch (e) { - console.warn('Invalid "depends_on" expression:', expression); + // If evaluation fails (e.g., parent is null), return false + // This is expected for conditions like "parent.is_submittable" when parent is not yet loaded out = false; } } else { diff --git a/apps/jingrow/frontend/src/core/pagetype/form/controls/HTML.vue b/apps/jingrow/frontend/src/core/pagetype/form/controls/HTML.vue index e1b9259..143da49 100644 --- a/apps/jingrow/frontend/src/core/pagetype/form/controls/HTML.vue +++ b/apps/jingrow/frontend/src/core/pagetype/form/controls/HTML.vue @@ -65,6 +65,7 @@ function handleDirtyChange(isDirty: boolean) {