diff --git a/CHANGELOG b/CHANGELOG index 786f6761af..0f7c038a41 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Improve loading strategy by using views * Add support of width attribute on tree view * Use non conflicting keyboard shortcuts * Use the context to get the suffix of window name diff --git a/src/model.js b/src/model.js index 96357801cd..f51d2ac254 100644 --- a/src/model.js +++ b/src/model.js @@ -566,42 +566,46 @@ } var id2record = {}; id2record[this.id] = this; - var loading; + var loading, views, field; if (name == '*') { loading = 'eager'; + views = new Set(); + var views_add = function(view) { + views.add(view); + }; for (fname in this.model.fields) { - if (!this.model.fields.hasOwnProperty(fname)) { - continue; - } - var field_loading = ( - this.model.fields[fname].description.loading || - 'eager'); - if (field_loading != 'eager') { + field = this.model.fields[fname]; + if ((field.description.loading || 'eager') == 'lazy') { loading = 'lazy'; - break; } + field.views.forEach(views_add); } } else { - loading = (this.model.fields[name].description.loading || - 'eager'); + loading = this.model.fields[name].description.loading || 'eager'; + views = this.model.fields[name].views; } - var fnames = []; + var fields = {}; if (loading == 'eager') { for (fname in this.model.fields) { - if (!this.model.fields.hasOwnProperty(fname)) { - continue; - } - if ((this.model.fields[fname].description.loading || - 'eager') == 'eager') { - fnames.push(fname); + field = this.model.fields[fname]; + if ((field.description.loading || 'eager') == 'eager') { + fields[fname] = field; } } } else { - fnames = Object.keys(this.model.fields); + fields = this.model.fields; + } + var fnames = []; + for (fname in fields) { + field = fields[fname]; + if (!(fname in this._loaded) && + (!views.size || + Sao.common.intersect( + Array.from(views).sort(), + Array.from(field.views).sort()))) { + fnames.push(fname); + } } - fnames = fnames.filter(function(e, i, a) { - return !(e in this._loaded); - }.bind(this)); var fnames_to_fetch = fnames.slice(); var rec_named_fields = ['many2one', 'one2one', 'reference']; for (var i in fnames) { @@ -1368,6 +1372,7 @@ init: function(description) { this.description = description; this.name = description.name; + this.views = new Set(); }, set: function(record, value) { record._values[this.name] = value; diff --git a/src/screen.js b/src/screen.js index be5c60aeb8..27c61cd0cd 100644 --- a/src/screen.js +++ b/src/screen.js @@ -793,6 +793,9 @@ } } this.group.add_fields(fields); + for (field in fields) { + this.group.model.fields[field].views.add(view_id); + } var view_widget = Sao.View.parse(this, xml_view, view.field_childs); view_widget.view_id = view_id; this.views.push(view_widget); @@ -1009,13 +1012,14 @@ return context; }, set_group: function(group) { - var fields = {}; + var fields = {}, + fields_views = {}, + name; if (this.group) { - for (var name in this.group.model.fields) { - if (!this.group.model.fields.hasOwnProperty(name)) { - continue; - } - fields[name] = this.group.model.fields[name].description; + for (name in this.group.model.fields) { + var field = this.group.model.fields[name]; + fields[name] = field.description; + fields_views[name] = field.views; } this.group.screens.splice( this.group.screens.indexOf(this), 1); @@ -1037,6 +1041,13 @@ this.set_current_record(null); } this.group.add_fields(fields); + var views_add = function(view) { + this.group.model.fields[name].views.add(view); + }.bind(this); + for (name in fields_views) { + var views = fields_views[name]; + views.forEach(views_add); + } }, new_group: function(context) { if (!context) { diff --git a/src/view/form.js b/src/view/form.js index 07c10293a3..b8ad4897cf 100644 --- a/src/view/form.js +++ b/src/view/form.js @@ -314,14 +314,26 @@ function eval_pyson(value){ var promesses = []; if (record) { // Force to set fields in record - // Get first the lazy one to reduce number of requests + // Get first the lazy one from the view to reduce number of requests var fields = []; for (name in record.model.fields) { field = record.model.fields[name]; - fields.push([name, field.description.loading || 'eager']); + if (field.views.has(this.view_id)) { + fields.push([ + name, + field.description.loading || 'eager' == 'eager', + field.views.size, + ]); + } } fields.sort(function(a, b) { - return a[1].localeCompare(b[1]); + if (!a[1] && b[1]) { + return -1; + } else if (a[1] && !b[1]) { + return 1; + } else { + return a[2] - b[2]; + } }); fields.forEach(function(e) { var name = e[0];