优化form_builder

This commit is contained in:
jingrow 2026-01-24 04:36:56 +08:00
parent 1c5b551206
commit 609670e37d
5 changed files with 17 additions and 7 deletions

View File

@ -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,
});

View File

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

View File

@ -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)" },

View File

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

View File

@ -65,6 +65,7 @@ function handleDirtyChange(isDirty: boolean) {
<FormBuilderComponent
:fields="fields"
:pagetype="pagetypeName"
:pagetype-record="record"
:readOnly="!canEdit"
:isCustomizeForm="false"
@update:fields="handleFieldsUpdate"