From cb1a298a4f9ca6165cce24dcff412fd43017f671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 20 May 2026 18:50:58 +0200 Subject: [PATCH] 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 --- sao/src/view/form.js | 47 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/sao/src/view/form.js b/sao/src/view/form.js index 0c617012c3..3c9bdcb83a 100644 --- a/sao/src/view/form.js +++ b/sao/src/view/form.js @@ -383,11 +383,12 @@ function eval_pyson(value){ }); 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) { @@ -425,7 +426,13 @@ function eval_pyson(value){ 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; @@ -3527,7 +3534,11 @@ function eval_pyson(value){ }, 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(); + } }, _set_button_sensitive: function() { var size_limit, o2m_size; @@ -3632,7 +3643,7 @@ function eval_pyson(value){ 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; @@ -3679,7 +3690,13 @@ function eval_pyson(value){ .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) { @@ -4007,7 +4024,11 @@ function eval_pyson(value){ } var message = name + ' / ' + Sao.common.humanize(size); this.badge.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(); @@ -4254,7 +4275,7 @@ function eval_pyson(value){ 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; @@ -4276,7 +4297,13 @@ function eval_pyson(value){ .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();