Explicitly set the previous view to switch to when opening a new Form

Closes #14975
This commit is contained in:
Nicolas Évrard
2026-07-29 17:48:54 +02:00
parent 0b1971ab59
commit 5f3c5c7b50
12 changed files with 51 additions and 22 deletions
+2
View File
@@ -2928,6 +2928,7 @@ function eval_pyson(value){
screen.current_record = screen.group.get(m2o_id);
new Sao.Window.Form(screen, callback, {
save_current: true,
prev_view: null,
});
});
return;
@@ -2998,6 +2999,7 @@ function eval_pyson(value){
new_: true,
save_current: true,
defaults: defaults,
prev_view: null,
});
});
},
+6 -1
View File
@@ -162,7 +162,12 @@
return label;
});
this.prev_view = screen.current_view;
// prev_view should stay null
if (kwargs.prev_view !== undefined) {
this.prev_view = kwargs.prev_view;
} else {
this.prev_view = screen.current_view;
}
this.screen.screen_container.alternate_view = true;
this.info_bar = new Sao.Window.InfoBar();
var view_type = kwargs.view_type || 'form';
+3 -2
View File
@@ -28,8 +28,9 @@ class Attachment(WinForm):
],
mode=['tree', 'form'],
readonly=not access['write'])
super().__init__(screen, self.callback,
view_type='tree', title=title)
super().__init__(
screen, self.callback, view_type='tree', title=title,
prev_view=screen.current_view)
screen.search_filter()
def destroy(self):
+3 -1
View File
@@ -110,7 +110,9 @@ class Log(WinForm):
screen = Screen('ir.model.log', domain=[
('resource', '=', self.resource),
], mode=['tree', 'form'])
super().__init__(screen, view_type='tree', title=title)
super().__init__(
screen, view_type='tree', title=title,
prev_view=screen.current_view)
screen.search_filter()
self.win.vbox.pack_start(grid, expand=False, fill=True, padding=0)
+3 -2
View File
@@ -18,8 +18,9 @@ class Note(WinForm):
screen = Screen('ir.note', domain=[
('resource', '=', self.resource),
], mode=['tree', 'form'])
super().__init__(screen, self.callback, view_type='tree',
title=title)
super().__init__(
screen, self.callback, view_type='tree', title=title,
prev_view=screen.current_view)
screen.search_filter()
def destroy(self):
@@ -120,7 +120,9 @@ class Action:
self.screen.current_record.save()
else:
self.screen.current_record.cancel()
WinForm(self.screen, callback, title=self.title.get_text())
WinForm(
self.screen, callback, title=self.title.get_text(),
prev_view=self.screen.current_view)
def display(self):
self.screen.search_filter(self.screen.screen_container.get_text())
@@ -284,7 +284,8 @@ class Many2Many(Widget):
# Force a display to clear the CellCache
self.screen.display()
self._popup = False
WinForm(screen, callback, save_current=True)
WinForm(
screen, callback, save_current=True, prev_view=screen.current_view)
def _sig_new(self, defaults=None):
if self._popup:
@@ -304,7 +305,8 @@ class Many2Many(Widget):
self._popup = False
WinForm(
screen, callback, new=True, save_current=True, defaults=defaults)
screen, callback, new=True, save_current=True, defaults=defaults,
prev_view=screen.current_view)
def _readonly_set(self, value):
super()._readonly_set(value)
@@ -186,7 +186,8 @@ class Many2One(Widget):
screen.current_record.rec_name()))
self._popup = False
WinForm(
screen, callback, new=True, save_current=True, defaults=defaults)
screen, callback, new=True, save_current=True, defaults=defaults,
prev_view=None)
def sig_edit(self, entry=None, icon_pos=None, *args):
if entry:
@@ -225,7 +226,7 @@ class Many2One(Widget):
force_change=True)
self._popup = False
self.changed = True
WinForm(screen, callback, save_current=True)
WinForm(screen, callback, save_current=True, prev_view=None)
return
if not self._readonly:
domain = self.field.domain_get(self.record)
@@ -398,7 +398,8 @@ class One2Many(Widget):
field_size -= len(self.field.get_eval(self.record)) + 1
WinForm(
self.screen, lambda a: update_sequence(), new=True,
defaults=defaults, many=field_size)
defaults=defaults, many=field_size,
prev_view=self.screen.current_view)
def _new_product(self, defaults=None):
fields = self.attrs['product'].split(',')
@@ -472,7 +473,7 @@ class One2Many(Widget):
def callback(result):
self._popup = False
WinForm(self.screen, callback)
WinForm(self.screen, callback, prev_view=self.screen.current_view)
def _sig_next(self, widget):
if not self._validate():
@@ -974,13 +974,15 @@ class M2O(GenericText):
if target_id and target_id >= 0:
screen.load([target_id])
screen.current_record = screen.group.get(target_id)
WinForm(screen, open_callback, save_current=True)
WinForm(
screen, open_callback, save_current=True,
prev_view=screen.current_view)
else:
defaults = defaults.copy() if defaults is not None else {}
defaults['rec_name'] = text
WinForm(
screen, open_callback, new=True, save_current=True,
defaults=defaults)
defaults=defaults, prev_view=screen.current_view)
def search_remote(self, record, field, text, callback=None):
model = self.get_model(record, field)
@@ -1127,7 +1129,9 @@ class O2M(GenericText):
def open_callback(result):
if callback:
callback()
WinForm(screen, open_callback, view_type='tree', context=context)
WinForm(
screen, open_callback, view_type='tree', context=context,
prev_view=screen.current_view)
class M2M(O2M):
@@ -1154,8 +1158,9 @@ class M2M(O2M):
def open_callback(result):
if callback:
callback()
WinForm(screen, open_callback, view_type='tree', domain=domain,
context=context)
WinForm(
screen, open_callback, view_type='tree', domain=domain,
context=context, prev_view=screen.current_view)
class Selection(GenericText, SelectionMixin, PopdownMixin):
+8 -3
View File
@@ -16,6 +16,7 @@ from tryton.gui.window.nomodal import NoModal
from .infobar import InfoBar
_ = gettext.gettext
SENTINEL = object()
class WinForm(NoModal, InfoBar):
@@ -23,7 +24,7 @@ class WinForm(NoModal, InfoBar):
def __init__(self, screen, callback=None, view_type='form',
new=False, many=0, domain=None, context=None,
save_current=False, title='', defaults=None):
save_current=False, title='', defaults=None, prev_view=SENTINEL):
tooltips = common.Tooltips()
NoModal.__init__(self)
@@ -49,7 +50,10 @@ class WinForm(NoModal, InfoBar):
if not title:
title = MODELNAME.get(screen.model_name)
self.title = title
self.prev_view = self.screen.current_view
if prev_view is not SENTINEL:
self.prev_view = prev_view
else:
self.prev_view = screen.current_view
self.screen.screen_container.alternate_view = True
self.screen.switch_view(view_type=view_type)
if self.screen.current_view.view_type != view_type:
@@ -519,7 +523,8 @@ class WinForm(NoModal, InfoBar):
viewport = self.screen.screen_container.alternate_viewport
if viewport and viewport.get_parent():
viewport.get_parent().remove(viewport)
self.screen.switch_view(view_type=self.prev_view.view_type)
if self.prev_view:
self.screen.switch_view(view_type=self.prev_view.view_type)
if getattr(self, 'win', None):
self.win.destroy()
NoModal.destroy(self)
+3 -1
View File
@@ -167,7 +167,9 @@ class WinSearch(NoModal):
else:
self.callback(None)
self.destroy()
WinForm(screen, callback, new=True, save_current=True)
WinForm(
screen, callback, new=True, save_current=True,
prev_view=screen.current_view)
return
if res:
group = self.screen.group