changeset 10d5a25dd646 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=10d5a25dd646
description:
        Use synchronous call in CSV windows

        This simplify the code and avoid race condition when selecting deferred 
fields.

        issue8633
        review267911002
diffstat:

 src/window.js |  136 ++++++++++++++++++++-------------------------------------
 1 files changed, 48 insertions(+), 88 deletions(-)

diffs (231 lines):

diff -r c50ce8b4fe43 -r 10d5a25dd646 src/window.js
--- a/src/window.js     Wed Sep 11 23:43:30 2019 +0200
+++ b/src/window.js     Thu Sep 12 22:45:20 2019 +0200
@@ -930,11 +930,8 @@
             }).css('cursor', 'pointer')
                 .appendTo(column_fields_all.find('.panel'));
 
-            var prm = this.get_fields(this.screen.model_name)
-                .then(function(fields){
-                    this.model_populate(fields);
-                    this.view_populate(this.fields_model, this.fields_all);
-                }.bind(this));
+            this.model_populate(this._get_fields(this.screen.model_name));
+            this.view_populate(this.fields_model, this.fields_all);
 
             this.column_buttons = jQuery('<div/>', {
                 'class': 'col-md-2'
@@ -1102,19 +1099,17 @@
             this.el.on('hidden.bs.modal', function() {
                 jQuery(this).remove();
             });
-            return prm;
         },
-        get_fields: function(model) {
+        _get_fields: function(model) {
             return Sao.rpc({
                 'method': 'model.' + model + '.fields_get'
-            }, this.session);
+            }, this.session, false);
         },
         on_row_expanded: function(node) {
             var container_view = jQuery('<ul/>').css('list-style', 'none')
                 .insertAfter(node.view);
-            this.children_expand(node).done(function() {
-                this.view_populate(node.children, container_view);
-            }.bind(this));
+            this.children_expand(node);
+            this.view_populate(node.children, container_view);
         },
         destroy: function() {
             this.el.modal('hide');
@@ -1274,17 +1269,11 @@
             }.bind(this));
         },
         children_expand: function(node) {
-            var dfd = jQuery.Deferred();
             if (jQuery.isEmptyObject(node.children)) {
-                this.get_fields(node.relation).done(function(fields) {
-                    this.model_populate(fields, node.children,
-                        node.field + '/', node.name + '/');
-                    dfd.resolve(this);
-                }.bind(this));
-            } else {
-                dfd.resolve(this);
+                this.model_populate(
+                    this._get_fields(node.relation), node.children,
+                    node.field + '/', node.name + '/');
             }
-            return dfd.promise();
         },
         autodetect: function() {
             var fname = this.file_input.val();
@@ -1306,20 +1295,18 @@
                 },
                 complete: function(results) {
                     results.data[0].forEach(function(word) {
-                        if(word in this.fields_invert || word in this.fields) {
-                            this.auto_select(word);
-                        }
-                        else {
+                        if (!(word in this.fields_invert) && !(word in 
this.fields)) {
                             var fields = this.fields_model;
                             var prefix = '';
-                            var parents = word.split('/');
-                            this.traverse(fields, prefix, parents, 0);
+                            var parents = word.split('/').slice(0, -1);
+                            this._traverse(fields, prefix, parents, 0);
                         }
+                        this._auto_select(word);
                     }.bind(this));
                 }.bind(this)
             });
         },
-        auto_select: function(word) {
+        _auto_select: function(word) {
             var name,field;
             if(word in this.fields_invert) {
                 name = word;
@@ -1343,30 +1330,20 @@
                     .siblings().removeClass('bg-primary');
             }).appendTo(this.fields_selected);
         },
-        traverse: function(fields, prefix, parents, i) {
-            if(i >= parents.length - 1) {
-                this.auto_select(parents.join('/'));
-                return;
-            }
+        _traverse: function(fields, prefix, parents, i) {
             var field, item;
             var names = Object.keys(fields);
-            for(item = 0; item<names.length; item++) {
+            for (item = 0; item<names.length; item++) {
                 field = fields[names[item]];
-                if(field.name == (prefix+parents[i]) ||
-                    field.field == (prefix+parents[i])) {
-                    this.children_expand(field).done(callback);
+                if (field.name == (prefix + parents[i]) ||
+                    field.field == (prefix + parents[i])) {
+                    this.children_expand(field);
+                    fields = field.children;
+                    prefix += parents[i] + '/';
+                    this._traverse(fields, prefix, parents, ++i);
                     break;
                 }
             }
-            if(item == names.length) {
-                this.auto_select(parents.join('/'));
-                return;
-            }
-            function callback(self) {
-                fields = field.children;
-                prefix += parents[i] + '/';
-                self.traverse(fields, prefix, parents, ++i);
-            }
         },
         response: function(response_id) {
             if(response_id == 'RESPONSE_OK') {
@@ -1426,20 +1403,19 @@
             this.session = Sao.Session.current_session;
             this.context = context;
             Sao.Window.Export._super.init.call(this,
-                Sao.i18n.gettext('CSV Export: %1',name)).then(function() {
-                    var fields = this.screen.model.fields;
-                    names.forEach(function(name) {
-                        var type = fields[name].description.type;
-                        if (type == 'selection') {
-                            this.sel_field(name + '.translated');
-                        } else if (type == 'reference') {
-                            this.sel_field(name + '.translated');
-                            this.sel_field(name + '/rec_name');
-                        } else {
-                            this.sel_field(name);
-                        }
-                    }.bind(this));
-                }.bind(this));
+                Sao.i18n.gettext('CSV Export: %1',name));
+            var fields = this.screen.model.fields;
+            names.forEach(function(name) {
+                var type = fields[name].description.type;
+                if (type == 'selection') {
+                    this.sel_field(name + '.translated');
+                } else if (type == 'reference') {
+                    this.sel_field(name + '.translated');
+                    this.sel_field(name + '/rec_name');
+                } else {
+                    this.sel_field(name);
+                }
+            }.bind(this));
 
             this.predef_exports = {};
             this.fill_predefwin();
@@ -1605,17 +1581,11 @@
             }.bind(this));
         },
         children_expand: function(node) {
-            var dfd = jQuery.Deferred();
-            if(jQuery.isEmptyObject(node.children)) {
-                this.get_fields(node.relation).done(function(fields) {
-                    this.model_populate(fields, node.children,
-                        node.path + '/', node.string + '/');
-                    dfd.resolve(this);
-                }.bind(this));
-            } else {
-                dfd.resolve(this);
+            if (jQuery.isEmptyObject(node.children)) {
+                this.model_populate(
+                    this._get_fields(node.relation), node.children,
+                    node.path + '/', node.string + '/');
             }
-            return dfd.promise();
         },
         sig_sel_add: function(el_field) {
             el_field = jQuery(el_field);
@@ -1741,8 +1711,8 @@
                 if (!(name in this.fields)) {
                     var fields = this.fields_model;
                     var prefix = '';
-                    var parents = name.split('/');
-                    this.traverse(fields, prefix, parents, 0);
+                    var parents = name.split('/').slice(0, -1);
+                    this._traverse(fields, prefix, parents, 0);
                 }
                 if(!(name in this.fields)) {
                     return;
@@ -1750,29 +1720,19 @@
                 this.sel_field(name);
             }.bind(this));
         },
-        traverse: function(fields, prefix, parents, i) {
-            if(i >= parents.length-1) {
-                this.sel_field(parents.join('/'));
-                return;
-            }
+        _traverse: function(fields, prefix, parents, i) {
             var field, item;
             var names = Object.keys(fields);
-            for(item = 0; item < names.length; item++) {
+            for (item = 0; item < names.length; item++) {
                 field = fields[names[item]];
-                if(field.path == (prefix+parents[i])) {
-                    this.children_expand(field).done(callback);
+                if (field.path == (prefix + parents[i])) {
+                    this.children_expand(field);
+                    fields = field.children;
+                    prefix += parents[i] + '/';
+                    this._traverse(fields, prefix, parents, ++i);
                     break;
                 }
             }
-            if(item == names.length) {
-                this.sel_field(parents.join('/'));
-                return;
-            }
-            function callback(self){
-                fields = field.children;
-                prefix += parents[i] + '/';
-                self.traverse(fields, prefix, parents, ++i);
-            }
         },
         sel_field: function(name) {
             var long_string = this.fields[name].long_string;

Reply via email to