details: https://code.tryton.org/tryton/commit/40e5cef2a7ea
branch: 7.0
user: Cédric Krier <[email protected]>
date: Wed Aug 05 17:39:38 2026 +0200
description:
Validate current record before switching to next/previous record in
window form
Closes #14994
(grafted from 9711708ebcd6242e98a4602da530369f176d6654)
diffstat:
sao/src/window.js | 22 ++++++++++++++++++++--
tryton/tryton/gui/window/win_form.py | 17 +++++++++++++++--
2 files changed, 35 insertions(+), 4 deletions(-)
diffs (65 lines):
diff -r 4023508ccb8b -r 40e5cef2a7ea sao/src/window.js
--- a/sao/src/window.js Tue Aug 04 14:43:53 2026 +0200
+++ b/sao/src/window.js Wed Aug 05 17:39:38 2026 +0200
@@ -481,11 +481,29 @@
undelete: function() {
this.screen.unremove();
},
+ validate: function() {
+ let prm = jQuery.Deferred();
+ this.screen.current_view.set_value();
+ var record = this.screen.current_record;
+ if (record) {
+ var fields = this.screen.current_view.get_fields();
+ if (!record.validate(fields)) {
+ this.screen.display(true).always(() => prm.reject());
+ return prm;
+ }
+ if (this.screen.pre_validate) {
+ return record.pre_validate().then(
+ prm.resolve, prm.reject);
+ }
+ }
+ prm.resolve();
+ return prm;
+ },
previous: function() {
- return this.screen.display_previous();
+ return this.validate().then(() => this.screen.display_previous());
},
next: function() {
- return this.screen.display_next();
+ return this.validate().then(() => this.screen.display_next());
},
switch_: function() {
return this.screen.switch_view();
diff -r 4023508ccb8b -r 40e5cef2a7ea tryton/tryton/gui/window/win_form.py
--- a/tryton/tryton/gui/window/win_form.py Tue Aug 04 14:43:53 2026 +0200
+++ b/tryton/tryton/gui/window/win_form.py Wed Aug 05 17:39:38 2026 +0200
@@ -314,11 +314,24 @@
self.screen.new()
self.screen.current_view.widget.set_sensitive(True)
+ def _validate(self):
+ self.screen.current_view.set_value()
+ if record := self.screen.current_record:
+ fields = self.screen.current_view.get_fields()
+ if not record.validate(fields):
+ self.screen.display(set_cursor=True)
+ return False
+ if self.screen.pre_validate and not record.pre_validate():
+ return False
+ return True
+
def _sig_next(self, widget):
- self.screen.display_next()
+ if self._validate():
+ self.screen.display_next()
def _sig_previous(self, widget):
- self.screen.display_prev()
+ if self._validate():
+ self.screen.display_prev()
def _sig_remove(self, widget, remove=False):
self.screen.remove(remove=remove)