summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic/basic_model.js
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2017-09-27 11:23:56 +0200
committerAaron Bohy <aab@odoo.com>2017-09-27 13:50:07 +0200
commitf49d758665938ed7cbb9f46221ba8f0663def514 (patch)
treefd43a08d9c17499189d3c8f5ac167ef2ca464899 /addons/web/static/src/js/views/basic/basic_model.js
parentb53ce01b16792724271a610bf07ea119fd798343 (diff)
[FIX] web: BasicModel: recursively compute onchange specs
Before this rev., onchange specs where only computed up to level 2 (i.e. for fields inside x2many fields). So basically, if there were a one2many list inside a one2many (e.g. which opens in a form view), the fields of that inner one2many list weren't added to the specs, and it could lead to unexpected responses from the server (like erasing the changes made on the inner one2many records). Closes #19600
Diffstat (limited to 'addons/web/static/src/js/views/basic/basic_model.js')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js33
1 files changed, 17 insertions, 16 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js
index 276fd4df82b..d85f55ddf36 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -1645,24 +1645,25 @@ var BasicModel = AbstractModel.extend({
var hasOnchange = false;
var specs = {};
var fieldsInfo = record.fieldsInfo[viewType || record.viewType];
-
- _.each(Object.keys(fieldsInfo), function (name) {
- var field = record.fields[name];
- var fieldInfo = fieldsInfo[name];
- specs[name] = (field.onChange) || "";
- if (field.onChange) {
- hasOnchange = true;
- }
- _.each(fieldInfo.views, function (view) {
- _.each(view.fieldsInfo[view.type], function (field, subname) {
- var onChange = view.fields[subname].onChange;
- specs[name + '.' + subname] = onChange || "";
- if (onChange) {
- hasOnchange = true;
- }
+ generateSpecs(fieldsInfo, record.fields);
+
+ // recursively generates the onchange specs for fields in fieldsInfo,
+ // and their subviews
+ function generateSpecs (fieldsInfo, fields, prefix) {
+ prefix = prefix || '';
+ _.each(Object.keys(fieldsInfo), function (name) {
+ var field = fields[name];
+ var fieldInfo = fieldsInfo[name];
+ var key = prefix + name;
+ specs[key] = (field.onChange) || "";
+ if (field.onChange) {
+ hasOnchange = true;
+ }
+ _.each(fieldInfo.views, function (view) {
+ generateSpecs(view.fieldsInfo[view.type], view.fields, key + '.');
});
});
- });
+ }
return hasOnchange ? specs : false;
},
/**