From 05ea37c779c9b9e80bc6b2fc0a5a480b7b595ae8 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 17 Jun 2022 16:16:58 +0530 Subject: [PATCH 1/3] fix: Set first visible tab as active --- frappe/public/js/frappe/form/form.js | 2 -- frappe/public/js/frappe/form/layout.js | 10 ++++++---- frappe/public/js/frappe/form/tab.js | 3 +-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index eefc629b4d..98a02850c1 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -575,8 +575,6 @@ frappe.ui.form.Form = class FrappeForm { this.$wrapper.trigger('render_complete'); - this.layout.set_first_tab_as_active(switched || this.cscript.is_onload); - if(!this.hidden) { this.layout.show_empty_form_message(); } diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index 080f8e0180..b808bdc7dc 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -123,7 +123,7 @@ frappe.ui.form.Layout = class Layout { if (this.is_tabbed_layout()) { // add a tab without `fieldname` to avoid conflicts - let default_tab = {label: __('Details'), fieldtype: "Tab Break"}; + let default_tab = {label: __('Details'), fieldtype: "Tab Break", fieldname: "__details"}; let first_tab = this.fields[1].fieldtype === "Tab Break" ? this.fields[1] : null; if (!first_tab) { this.fields.splice(1, 0, default_tab); @@ -336,12 +336,14 @@ frappe.ui.form.Layout = class Layout { if (visible_tabs && visible_tabs.length == 1) { visible_tabs[0].parent.toggleClass('hide show'); } + this.set_first_tab_as_active(); } - set_first_tab_as_active(switched) { - if (this.tabs.length && (switched || !this.frm.active_tab)) { + set_first_tab_as_active() { + if (this.tabs.length && !this.frm.active_tab) { // set first tab as active when opening for first time, or new doc - this.tabs[0].set_active(); + let first_visible_tab = this.tabs.find(tab => !tab.is_hidden()); + first_visible_tab.set_active(); } } diff --git a/frappe/public/js/frappe/form/tab.js b/frappe/public/js/frappe/form/tab.js index 69c573186b..5c95fad582 100644 --- a/frappe/public/js/frappe/form/tab.js +++ b/frappe/public/js/frappe/form/tab.js @@ -87,7 +87,6 @@ export default class Tab { } is_hidden() { - this.wrapper.hasClass('hide') - && this.parent.hasClass('hide'); + return this.wrapper.hasClass('hide'); } } From 3f2901d837d6aabbb28aafc8c9ea4f121848f9ca Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 17 Jun 2022 16:56:11 +0530 Subject: [PATCH 2/3] fix: Check if visible tab exists --- 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 b808bdc7dc..f46f70ca48 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -343,7 +343,7 @@ frappe.ui.form.Layout = class Layout { if (this.tabs.length && !this.frm.active_tab) { // set first tab as active when opening for first time, or new doc let first_visible_tab = this.tabs.find(tab => !tab.is_hidden()); - first_visible_tab.set_active(); + first_visible_tab && first_visible_tab.set_active(); } } From ee7cb22cd64e2614b05ed5a83db6756ad71e982c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 17 Jun 2022 18:17:54 +0530 Subject: [PATCH 3/3] fix: Remember active tab for a document in a browsing session --- frappe/public/js/frappe/form/form.js | 9 +++++++++ frappe/public/js/frappe/form/layout.js | 9 ++++++--- frappe/public/js/frappe/form/tab.js | 8 +++++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/frappe/public/js/frappe/form/form.js b/frappe/public/js/frappe/form/form.js index 98a02850c1..13d61d689b 100644 --- a/frappe/public/js/frappe/form/form.js +++ b/frappe/public/js/frappe/form/form.js @@ -1840,6 +1840,15 @@ frappe.ui.form.Form = class FrappeForm { }); }); } + set_active_tab(tab) { + if (!this.active_tab_map) { + this.active_tab_map = {}; + } + this.active_tab_map[this.docname] = tab; + } + get_active_tab() { + return this.active_tab_map && this.active_tab_map[this.docname]; + } }; frappe.validated = 0; diff --git a/frappe/public/js/frappe/form/layout.js b/frappe/public/js/frappe/form/layout.js index f46f70ca48..add9ce7b8b 100644 --- a/frappe/public/js/frappe/form/layout.js +++ b/frappe/public/js/frappe/form/layout.js @@ -336,11 +336,14 @@ frappe.ui.form.Layout = class Layout { if (visible_tabs && visible_tabs.length == 1) { visible_tabs[0].parent.toggleClass('hide show'); } - this.set_first_tab_as_active(); + this.set_tab_as_active(); } - set_first_tab_as_active() { - if (this.tabs.length && !this.frm.active_tab) { + set_tab_as_active() { + let frm_active_tab = this?.frm.get_active_tab?.(); + if (frm_active_tab) { + frm_active_tab.set_active(); + } else if (this.tabs.length) { // set first tab as active when opening for first time, or new doc let first_visible_tab = this.tabs.find(tab => !tab.is_hidden()); first_visible_tab && first_visible_tab.set_active(); diff --git a/frappe/public/js/frappe/form/tab.js b/frappe/public/js/frappe/form/tab.js index 5c95fad582..324d0c50c8 100644 --- a/frappe/public/js/frappe/form/tab.js +++ b/frappe/public/js/frappe/form/tab.js @@ -10,6 +10,7 @@ export default class Tab { this.fields_list = []; this.fields_dict = {}; this.make(); + this.setup_listeners(); this.refresh(); } @@ -79,7 +80,6 @@ export default class Tab { set_active() { this.parent.find('.nav-link').tab('show'); this.wrapper.addClass('active'); - this.frm.active_tab = this; } is_active() { @@ -89,4 +89,10 @@ export default class Tab { is_hidden() { return this.wrapper.hasClass('hide'); } + + setup_listeners() { + this.parent.find('.nav-link').on('shown.bs.tab', () => { + this?.frm.set_active_tab?.(this); + }); + } }