From c415e2781a77c9c030ec29428f690a44580ff888 Mon Sep 17 00:00:00 2001 From: David Arnold Date: Sat, 24 Jun 2023 13:22:37 -0500 Subject: [PATCH 1/4] fix: replace_field splice needs an (integer) index not an element also section field management must be taken into account for all sections --- frappe/public/js/frappe/form/layout.js | 10 ++++++---- frappe/public/js/frappe/form/section.js | 10 ++++++++++ frappe/public/js/frappe/form/tab.js | 3 +++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index a01b414a0c..3b20da9414 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -191,12 +191,14 @@ frappe.ui.form.Layout = class Layout { replace_field(fieldname, df, render) { df.fieldname = fieldname; // change of fieldname is avoided if (this.fields_dict[fieldname] && this.fields_dict[fieldname].df) { - const fieldobj = this.init_field(df, render); + let fieldobj = this.init_field(df, render); + const prev_fieldobj = this.fields_dict[fieldname]; + const idx = this.fields_list.findIndex((e) => e == prev_fieldobj); this.fields_dict[fieldname].$wrapper.remove(); - this.fields_list.splice(this.fields_dict[fieldname], 1, fieldobj); + this.fields_list.splice(idx, 1, fieldobj); this.fields_dict[fieldname] = fieldobj; - this.section.fields_list.splice(this.section.fields_dict[fieldname], 1, fieldobj); - this.section.fields_dict[fieldname] = fieldobj; + this.sections.forEach((section) => section.replace_field(fieldname, fieldobj)); + prev_fieldobj.tab.replace_field(fieldobj); this.refresh_fields([df]); } } diff --git a/frappe/public/js/frappe/form/section.js b/frappe/public/js/frappe/form/section.js index 5acae84f46..28db1c16cf 100644 --- a/frappe/public/js/frappe/form/section.js +++ b/frappe/public/js/frappe/form/section.js @@ -82,6 +82,16 @@ export default class Section { } } + replace_field(fieldname, fieldobj) { + if (this.fields_dict[fieldname]?.df) { + const olfldobj = this.fields_dict[fieldname]; + const idx = this.fields_list.findIndex((e) => e == olfldobj); + this.fields_list.splice(idx, 1, fieldobj); + this.fields_dict[fieldname] = fieldobj; + fieldobj.section = this; + } + } + add_field(fieldobj) { this.fields_list.push(fieldobj); this.fields_dict[fieldobj.df.fieldname] = fieldobj; diff --git a/frappe/public/js/frappe/form/tab.js b/frappe/public/js/frappe/form/tab.js index 7ededcdd28..c81985b13a 100644 --- a/frappe/public/js/frappe/form/tab.js +++ b/frappe/public/js/frappe/form/tab.js @@ -76,6 +76,9 @@ export default class Tab { add_field(fieldobj) { fieldobj.tab = this; } + replace_field(fieldobj) { + fieldobj.tab = this; + } set_active() { this.tab_link.find(".nav-link").tab("show"); From 60231c7f358e0f10d19d5bd3ee0cc77eafe14e77 Mon Sep 17 00:00:00 2001 From: David Arnold Date: Sat, 17 Jun 2023 22:23:40 -0500 Subject: [PATCH 2/4] fix: replace field replacing correct dom element --- frappe/public/js/frappe/form/layout.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 3b20da9414..6848380239 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -191,10 +191,10 @@ frappe.ui.form.Layout = class Layout { replace_field(fieldname, df, render) { df.fieldname = fieldname; // change of fieldname is avoided if (this.fields_dict[fieldname] && this.fields_dict[fieldname].df) { - let fieldobj = this.init_field(df, render); const prev_fieldobj = this.fields_dict[fieldname]; + const fieldobj = this.init_field(df, prev_fieldobj.parent, render); + prev_fieldobj.$wrapper.replaceWith(fieldobj.$wrapper); const idx = this.fields_list.findIndex((e) => e == prev_fieldobj); - this.fields_dict[fieldname].$wrapper.remove(); this.fields_list.splice(idx, 1, fieldobj); this.fields_dict[fieldname] = fieldobj; this.sections.forEach((section) => section.replace_field(fieldname, fieldobj)); @@ -207,7 +207,8 @@ frappe.ui.form.Layout = class Layout { !this.section && this.make_section(); !this.column && this.make_column(); - const fieldobj = this.init_field(df, render); + const parent = this.column.form.get(0); + const fieldobj = this.init_field(df, parent, render); this.fields_list.push(fieldobj); this.fields_dict[df.fieldname] = fieldobj; @@ -219,11 +220,11 @@ frappe.ui.form.Layout = class Layout { } } - init_field(df, render = false) { + init_field(df, parent, render = false) { const fieldobj = frappe.ui.form.make_control({ df: df, doctype: this.doctype, - parent: this.column.form.get(0), + parent: parent, frm: this.frm, render_input: render, doc: this.doc, From 8bf4008c5cead34ca02a539078e86f4c7efc8181 Mon Sep 17 00:00:00 2001 From: Shariq Ansari <30859809+shariquerik@users.noreply.github.com> Date: Mon, 3 Jul 2023 18:07:49 +0530 Subject: [PATCH 3/4] fix: avoid this line if there is no tab break field in the form --- frappe/public/js/frappe/form/layout.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 6848380239..cf976fba00 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -198,7 +198,7 @@ frappe.ui.form.Layout = class Layout { this.fields_list.splice(idx, 1, fieldobj); this.fields_dict[fieldname] = fieldobj; this.sections.forEach((section) => section.replace_field(fieldname, fieldobj)); - prev_fieldobj.tab.replace_field(fieldobj); + prev_fieldobj.tab?.replace_field(fieldobj); this.refresh_fields([df]); } } From 9c4c5d647f34fb6400a2e94e8f911e7e968642dc Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Tue, 4 Jul 2023 10:34:23 +0530 Subject: [PATCH 4/4] chore: early return in read only mode --- frappe/core/doctype/access_log/access_log.py | 1 + 1 file changed, 1 insertion(+) diff --git a/frappe/core/doctype/access_log/access_log.py b/frappe/core/doctype/access_log/access_log.py index 5a6b304e9e..b7127b3a44 100644 --- a/frappe/core/doctype/access_log/access_log.py +++ b/frappe/core/doctype/access_log/access_log.py @@ -76,6 +76,7 @@ def _make_access_log( if frappe.flags.read_only: access_log.deferred_insert() + return else: access_log.db_insert()