details:   https://code.tryton.org/tryton/commit/9711708ebcd6
branch:    default
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
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 8ac6e6b21859 -r 9711708ebcd6 sao/src/window.js
--- a/sao/src/window.js Wed Aug 05 11:08:08 2026 +0200
+++ b/sao/src/window.js Wed Aug 05 17:39:38 2026 +0200
@@ -540,11 +540,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 8ac6e6b21859 -r 9711708ebcd6 tryton/tryton/gui/window/win_form.py
--- a/tryton/tryton/gui/window/win_form.py      Wed Aug 05 11:08:08 2026 +0200
+++ b/tryton/tryton/gui/window/win_form.py      Wed Aug 05 17:39:38 2026 +0200
@@ -319,11 +319,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)

Reply via email to