diff --git a/cypress/integration/form_builder.js b/cypress/integration/form_builder.js
index 43cec97a39..53c45cd379 100644
--- a/cypress/integration/form_builder.js
+++ b/cypress/integration/form_builder.js
@@ -77,7 +77,8 @@ context("Form Builder", () => {
.as("input");
cy.get("@input").clear({ force: true }).type("Web Form Field", { delay: 200 });
cy.wait("@search_link");
- cy.get("@input").type("{enter}").blur();
+
+ cy.get(first_field).click({ force: true });
cy.get(first_field)
.find(".table-controls .table-column")
diff --git a/frappe/public/js/form_builder/components/FieldProperties.vue b/frappe/public/js/form_builder/components/FieldProperties.vue
index 9cb5c8707b..12a8ce79ef 100644
--- a/frappe/public/js/form_builder/components/FieldProperties.vue
+++ b/frappe/public/js/form_builder/components/FieldProperties.vue
@@ -10,11 +10,14 @@ let search_text = ref("");
let args = ref({});
let docfield_df = computed(() => {
- let fields = store.get_docfields.filter(df => {
+ let fields = store.get_docfields.filter((df) => {
if (in_list(frappe.model.layout_fields, df.fieldtype) || df.hidden) {
return false;
}
- if (df.depends_on && !evaluate_depends_on_value(df.depends_on, store.form.selected_field)) {
+ if (
+ df.depends_on &&
+ !evaluate_depends_on_value(df.depends_on, store.form.selected_field)
+ ) {
return false;
}
diff --git a/frappe/public/js/form_builder/components/controls/CodeControl.vue b/frappe/public/js/form_builder/components/controls/CodeControl.vue
index b0a45a442f..77bbaa3b7e 100644
--- a/frappe/public/js/form_builder/components/controls/CodeControl.vue
+++ b/frappe/public/js/form_builder/components/controls/CodeControl.vue
@@ -7,43 +7,47 @@ let emit = defineEmits(["update:modelValue"]);
let slots = useSlots();
let code = ref(null);
-let code_control = ref(null);
let update_control = ref(true);
+let code_control = computed(() => {
+ if (!code.value) return;
+ code.value.innerHTML = "";
+
+ return frappe.ui.form.make_control({
+ parent: code.value,
+ df: {
+ ...props.df,
+ fieldtype: "Code",
+ hidden: 0,
+ read_only: props.read_only,
+ change: () => {
+ if (update_control.value) {
+ content.value = code_control.value.get_value();
+ }
+ update_control.value = true;
+ },
+ },
+ value: content.value,
+ disabled: Boolean(slots.label) || props.read_only,
+ render_input: true,
+ only_input: Boolean(slots.label),
+ });
+});
+
let content = computed({
get: () => props.modelValue,
- set: (value) => emit('update:modelValue', value)
+ set: (value) => emit("update:modelValue", value),
});
onMounted(() => {
- if (code.value) {
- code_control.value = frappe.ui.form.make_control({
- parent: code.value,
- df: {
- ...props.df,
- fieldtype: "Code",
- hidden: 0,
- read_only: props.read_only,
- change: () => {
- if (update_control.value) {
- content.value = code_control.value.get_value();
- }
- update_control.value = true;
- }
- },
- value: content.value,
- disabled: Boolean(slots.label) || props.read_only,
- render_input: true,
- only_input: Boolean(slots.label),
- });
- }
+ if (code.value) code_control.value;
});
watch(
() => content.value,
(value) => {
update_control.value = false;
- code_control.value.set_value(value);
+ code_control.value?.set_value(value);
}
);
@@ -53,7 +57,7 @@ watch(
if (code_control.value) {
code_control.value.ace_editor_target.css("max-height", value);
}
- },
+ }
);
diff --git a/frappe/public/js/form_builder/components/controls/DataControl.vue b/frappe/public/js/form_builder/components/controls/DataControl.vue
index e0d913b0f6..f0fb2d244a 100644
--- a/frappe/public/js/form_builder/components/controls/DataControl.vue
+++ b/frappe/public/js/form_builder/components/controls/DataControl.vue
@@ -48,7 +48,7 @@ if (props.df.fieldtype === "Icon") {
class="form-control"
type="text"
:value="value"
- :disabled="read_only"
+ :disabled="read_only || df.read_only"
@input="event => $emit('update:modelValue', event.target.value)"
/>
doctype.value, () => fieldname.value], ([doctype_value, fieldname_v
-