changeset 10156791f1ed in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=10156791f1ed
description:
        Set loaded fields first after O2M on_change calls

        issue9930
        review302811002
diffstat:

 src/model.js |  34 +++++++++++++++++++++++++++-------
 1 files changed, 27 insertions(+), 7 deletions(-)

diffs (72 lines):

diff -r d8485f101974 -r 10156791f1ed src/model.js
--- a/src/model.js      Wed Feb 03 19:39:33 2021 +0100
+++ b/src/model.js      Thu Feb 04 18:05:18 2021 +0100
@@ -2277,7 +2277,7 @@
             if (value.add || value.update) {
                 var context = this.get_context(record);
                 fields = record._values[this.name].model.fields;
-                var field_names = {};
+                var new_field_names = {};
                 var adding_values = [];
                 if (value.add) {
                     for (var i=0; i < value.add.length; i++) {
@@ -2291,25 +2291,25 @@
                                 if (!(f in fields) &&
                                     (f != 'id') &&
                                     (!~f.indexOf('.'))) {
-                                        field_names[f] = true;
+                                        new_field_names[f] = true;
                                     }
                             });
                         });
                     }
                 });
-                if (!jQuery.isEmptyObject(field_names)) {
+                if (!jQuery.isEmptyObject(new_field_names)) {
                     var args = {
                         'method': 'model.' + this.description.relation +
                             '.fields_get',
-                        'params': [Object.keys(field_names), context]
+                        'params': [Object.keys(new_field_names), context]
                     };
                     try {
-                        fields = Sao.rpc(args, record.model.session, false);
+                        new_fields = Sao.rpc(args, record.model.session, 
false);
                     } catch (e) {
                         return;
                     }
                 } else {
-                    fields = {};
+                    new_fields = {};
                 }
             }
 
@@ -2332,7 +2332,27 @@
             }
 
             if (value.add || value.update) {
-                group.add_fields(fields);
+                // First set already added fields to prevent triggering a
+                // second on_change call
+                if (value.update) {
+                    value.update.forEach(function(vals) {
+                        if (!vals.id) {
+                            return;
+                        }
+                        var record2 = group.get(vals.id);
+                        if (record2) {
+                            var vals_to_set = {};
+                            for (var key in vals) {
+                                if (!(key in new_field_names)) {
+                                    vals_to_set[key] = vals[key];
+                                }
+                            }
+                            record2.set_on_change(vals_to_set);
+                        }
+                    });
+                }
+
+                group.add_fields(new_fields);
                 if (value.add) {
                     value.add.forEach(function(vals) {
                         var new_record;

Reply via email to