From 492fb7731b0465b59e729aa2ac6b0a05904d2f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Tue, 31 Dec 2024 01:15:42 +0100 Subject: [PATCH] Switch to searchable view when trigger search menu Closes #12743 --- sao/src/screen.js | 13 ++++++++++++- sao/src/tab.js | 16 ++++++++-------- tryton/tryton/gui/window/form.py | 8 +++++--- .../tryton/gui/window/view_form/screen/screen.py | 6 +++++- .../window/view_form/view/screen_container.py | 3 +++ 5 files changed, 33 insertions(+), 13 deletions(-) diff --git a/sao/src/screen.js b/sao/src/screen.js index 8b1554522a..fc7a2b2a8a 100644 --- a/sao/src/screen.js +++ b/sao/src/screen.js @@ -221,6 +221,12 @@ } this.el.append(this.content_box); }, + grab_focus: function() { + this.filter_box.toggleClass('hidden-xs', false); + window.setTimeout(() => { + this.search_entry.focus(); + }, 0); + }, set_text: function(value) { this.search_entry.val(value); this.bookmark_match(); @@ -937,7 +943,8 @@ return next_view; }, switch_view: function( - view_type=null, view_id=null, creatable=null, display=true) { + view_type=null, view_id=null, creatable=null, searchable=null, + display=true) { if (view_id !== null) { view_id = Number(view_id); } @@ -971,6 +978,10 @@ if (creatable !== null) { result &= this.current_view.creatable == creatable; } + if (searchable !== null) { + result &= Boolean(~['tree', 'graph', 'calendar'].indexOf( + this.current_view.view_type)) == searchable; + } return result; }; const _switch = () => { diff --git a/sao/src/tab.js b/sao/src/tab.js index 82070fd835..27b593f409 100644 --- a/sao/src/tab.js +++ b/sao/src/tab.js @@ -987,14 +987,14 @@ }); }, search: function() { - var search_entry = this.screen.screen_container.search_entry; - search_entry.parents('.filter-box').toggleClass('hidden-xs'); - if (search_entry.is(':visible')) { - window.setTimeout(function() { - search_entry.focus(); - }, 0); - } - return jQuery.when(); + return this.modified_save().then(() => { + return this.screen.switch_view( + null, null, null, true, false).then(() => { + return this.screen.display().done(() => { + this.screen.screen_container.grab_focus(); + }); + }); + }); }, logs: function() { var record = this.screen.current_record; diff --git a/tryton/tryton/gui/window/form.py b/tryton/tryton/gui/window/form.py index 3da4f05e5f..2d9441ddc4 100644 --- a/tryton/tryton/gui/window/form.py +++ b/tryton/tryton/gui/window/form.py @@ -556,9 +556,11 @@ class Form(TabContent): self.buttons['copy_url'].props.active = True def sig_search(self, widget): - search_container = self.screen.screen_container - if hasattr(search_container, 'search_entry'): - search_container.search_entry.grab_focus() + if not self.modified_save(): + return + self.screen.switch_view(searchable=True, display=False) + self.screen.display() + self.screen.screen_container.grab_focus() def action_popup(self, widget): button, = widget.get_children() diff --git a/tryton/tryton/gui/window/view_form/screen/screen.py b/tryton/tryton/gui/window/view_form/screen/screen.py index ed4e126717..2e81b6097b 100644 --- a/tryton/tryton/gui/window/view_form/screen/screen.py +++ b/tryton/tryton/gui/window/view_form/screen/screen.py @@ -559,7 +559,8 @@ class Screen: return next_view def switch_view( - self, view_type=None, view_id=None, creatable=None, display=True): + self, view_type=None, view_id=None, creatable=None, + searchable=None, display=True): if view_id is not None: view_id = int(view_id) if self.current_view: @@ -585,6 +586,9 @@ class Screen: result &= self.current_view.view_id == view_id if creatable is not None: result &= self.current_view.creatable == creatable + if searchable is not None: + result &= (self.current_view.view_type in { + 'tree', 'graph', 'calendar'}) == searchable return result for i in range(len(self.views) + len(self.view_to_load)): if len(self.view_to_load): diff --git a/tryton/tryton/gui/window/view_form/view/screen_container.py b/tryton/tryton/gui/window/view_form/view/screen_container.py index e09c7fb3f0..3dff2b2aa6 100644 --- a/tryton/tryton/gui/window/view_form/view/screen_container.py +++ b/tryton/tryton/gui/window/view_form/view/screen_container.py @@ -349,6 +349,9 @@ class ScreenContainer(object): tooltips.enable() + def grab_focus(self): + self.search_entry.grab_focus() + def widget_get(self): return self.vbox