From 91911159f5bc12046d791744ff23562378be047f Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Tue, 6 Jan 2015 18:50:28 +0100 Subject: [FIX] web: editable list, no re-rendering on field validation When adding several lines in an editable list (adding 7 lines to an invoice for instance), then clicking on the first row direcly after having filled the last line, the value of the cell sometimes had the value of the last line. Just a display bug, but still. Using internal_set_value avoid the re-rendering of the cell, and solve the above issue opw-620111 --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/web/static/src/js/view_form.js') diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index aceb3e665fd..48df090a8d9 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3892,7 +3892,7 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ r = record; _.each(self.editor.form.fields, function(field){ field._inhibit_on_change_flag = true; - field.set_value(r.attributes[field.name]); + field.internal_set_value(r.attributes[field.name]); field._inhibit_on_change_flag = false; }); return _.every(self.editor.form.fields, function(field){ -- cgit v1.2.3 From 38aa984f31f525539d27f2bf47806352705830ba Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Fri, 9 Jan 2015 18:02:48 +0100 Subject: [FIX] web: avoid rendering fields on one2many list validation This rev. reverts 91911159f5bc12046d791744ff23562378be047f The above rev. was a good idea, except that internal_set_value expects the raw value, while the records attributes can be tuples(for instance, many2one are tuple(id, name) or list of command(one2many, many2many). set_value must be use here, as all fields (js) override set_value in order to handle their value repr (for instance, many2one fields handle the tuple (id,name). Besides, avoiding the re-render provides a huge performance improvment, as rerendering fields can lead to xmlrpc calls (for instance, re-rendering a many2one field implies calling the name_get method) opw-620111 opw-622108 --- addons/web/static/src/js/view_form.js | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) (limited to 'addons/web/static/src/js/view_form.js') diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 48df090a8d9..fd1fbdb22ad 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3094,7 +3094,7 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc reinit_value: function(val) { this.internal_set_value(val); this.floating = false; - if (this.is_started) + if (this.is_started && !this.no_rerender) this.render_value(); }, initialize_field: function() { @@ -3328,14 +3328,14 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc } if (! no_recurse) { var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context()); - this.alive(dataset.name_get([self.get("value")])).done(function(data) { + this.view.render_value_defs.push(this.alive(dataset.name_get([self.get("value")])).done(function(data) { if (!data[0]) { self.do_warn(_t("Render"), _t("No value found for the field "+self.field.string+" for value "+self.get("value"))); return; } self.display_value["" + self.get("value")] = data[0][1]; self.render_value(true); - }); + })); } }, display_string: function(str) { @@ -3741,7 +3741,7 @@ instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ this.dataset.index = 0; } this.trigger_on_change(); - if (this.is_started) { + if (this.is_started && !this.no_rerender) { return self.reload_current_view(); } else { return $.when(); @@ -3888,12 +3888,19 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ return true; } var r; - return _.every(this.records.records, function(record){ + if (_.isEmpty(this.records.records)){ + return true; + } + current_values = {}; + _.each(this.editor.form.fields, function(field){ + field._inhibit_on_change_flag = true; + field.no_rerender = true; + current_values[field.name] = field.get('value'); + }); + var valid = _.every(this.records.records, function(record){ r = record; _.each(self.editor.form.fields, function(field){ - field._inhibit_on_change_flag = true; - field.internal_set_value(r.attributes[field.name]); - field._inhibit_on_change_flag = false; + field.set_value(r.attributes[field.name]); }); return _.every(self.editor.form.fields, function(field){ field.process_modifiers(); @@ -3901,6 +3908,12 @@ instance.web.form.One2ManyListView = instance.web.ListView.extend({ return field.is_valid(); }); }); + _.each(this.editor.form.fields, function(field){ + field.set('value', current_values[field.name]); + field._inhibit_on_change_flag = false; + field.no_rerender = false; + }); + return valid; }, do_add_record: function () { if (this.editable()) { -- cgit v1.2.3 From 275367581bbf26496607224cff3b5c16340098b9 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Tue, 13 Jan 2015 12:44:16 +0100 Subject: [FIX] web: view is not always defined when a many2one is rendered This rev. is associated with rev. 38aa984f31f525539d27f2bf47806352705830ba closes #4660 --- addons/web/static/src/js/view_form.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/view_form.js') diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index fd1fbdb22ad..5581ca7b0ae 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -3328,14 +3328,17 @@ instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(instanc } if (! no_recurse) { var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context()); - this.view.render_value_defs.push(this.alive(dataset.name_get([self.get("value")])).done(function(data) { + var def = this.alive(dataset.name_get([self.get("value")])).done(function(data) { if (!data[0]) { self.do_warn(_t("Render"), _t("No value found for the field "+self.field.string+" for value "+self.get("value"))); return; } self.display_value["" + self.get("value")] = data[0][1]; self.render_value(true); - })); + }); + if (this.view && this.view.render_value_defs){ + this.view.render_value_defs.push(def); + } } }, display_string: function(str) { -- cgit v1.2.3