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;