From f49d758665938ed7cbb9f46221ba8f0663def514 Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Wed, 27 Sep 2017 11:23:56 +0200 Subject: [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 --- .../web/static/src/js/views/basic/basic_model.js | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'addons/web/static/src/js/views/basic/basic_model.js') 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; }, /** -- cgit v1.2.3