details:   https://code.tryton.org/tryton/commit/f750d9d77333
branch:    7.0
user:      Cédric Krier <[email protected]>
date:      Wed May 20 18:50:58 2026 +0200
description:
        Make display synchronous when possible

        In order to ensure that after the focus out of a field that triggers
        on_change's, the view is fully displayed before the set_value call from 
the
        Window.Form response. Otherwise the set_value restore the previous 
value.

        Closes #14853
        (grafted from fd5d15e75c92282fcadee930c6b51cb02397bbb6)
diffstat:

 sao/src/view/form.js |  47 +++++++++++++++++++++++++++++++++++++----------
 1 files changed, 37 insertions(+), 10 deletions(-)

diffs (108 lines):

diff -r c17fc6f55afe -r f750d9d77333 sao/src/view/form.js
--- a/sao/src/view/form.js      Sat Jun 06 11:47:25 2026 +0200
+++ b/sao/src/view/form.js      Wed May 20 18:50:58 2026 +0200
@@ -366,11 +366,12 @@
                 });
                 for (const e of fields) {
                     const name = e[0];
-                    promesses.push(record.load(name));
+                    if (!record.is_loaded(name)) {
+                        promesses.push(record.load(name));
+                    }
                 }
             }
-            return jQuery.when.apply(jQuery,promesses)
-                .then(() => {
+            let display = function() {
                     let promesses = [];
                     var record = this.record;
                     for (const name in this.widgets) {
@@ -406,7 +407,13 @@
                             container.set_grid_template();
                         }
                     });
-                });
+                }.bind(this);
+            if (promesses.length) {
+                return jQuery.when.apply(jQuery, promesses).then(
+                    () => display());
+            } else {
+                return display();
+            }
         },
         set_value: function() {
             var record = this.record;
@@ -3355,7 +3362,11 @@
         },
         set_readonly: function(readonly) {
             Sao.View.Form.One2Many._super.set_readonly.call(this, readonly);
-            this.prm.done(() => this._set_button_sensitive());
+            if (this.prm.state() == 'pending') {
+                this.prm.done(() => this._set_button_sensitive());
+            } else {
+                this._set_button_sensitive();
+            }
             this._set_label_state();
         },
         set_required: function(required) {
@@ -3443,7 +3454,7 @@
         display: function() {
             Sao.View.Form.One2Many._super.display.call(this);
 
-            return this.prm.then(() => {
+            let display = function() {
                 this._set_button_sensitive();
 
                 var record = this.record;
@@ -3489,7 +3500,13 @@
                         .css('max-height', this.attributes.height + 'px');
                 }
                 return this.screen.display();
-            });
+            }.bind(this);
+
+            if (this.prm.state() == 'pending') {
+                return this.prm.then(() => display());
+            } else {
+                return display();
+            }
         },
         focus: function() {
             if (this.attributes.add_remove) {
@@ -3735,7 +3752,11 @@
             }
             var message = name + ' / ' + Sao.common.humanize(size);
             this.label.text(message).attr('title', message);
-            this.prm.done(() => this._set_button_sensitive());
+            if (this.prm.state() == 'pending') {
+                this.prm.done(() => this._set_button_sensitive());
+            } else {
+                this._set_button_sensitive();
+            }
         },
         validate: function() {
             var prm = jQuery.Deferred();
@@ -3964,7 +3985,7 @@
         display: function() {
             Sao.View.Form.Many2Many._super.display.call(this);
 
-            return this.prm.then(() => {
+            let display = function() {
                 var record = this.record;
                 var field = this.field;
 
@@ -3985,7 +4006,13 @@
                         .css('max-height', this.attributes.height + 'px');
                 }
                 return this.screen.display();
-            });
+            }.bind(this);
+
+            if (this.prm.state() == 'pending') {
+                return this.prm.then(() => display());
+            } else {
+                return display();
+            }
         },
         focus: function() {
             this.entry.focus();

Reply via email to