From 1d8798da2ac275916613b8fd1d77e92ed2ac95a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Wed, 20 Jun 2018 11:22:18 +0200 Subject: [PATCH] Add views of the field in the loading strategy This strategy limits the selection of other fields to load in bunch to those sharing at least one common view. issue7359 review47351002 --- CHANGELOG | 1 + src/model.js | 49 ++++++++++++++++++++++++++---------------------- src/screen.js | 23 +++++++++++++++++------ src/view/form.js | 18 +++++++++++++++--- 4 files changed, 60 insertions(+), 31 deletions(-) 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];