diff options
| author | Aaron Bohy <aab@odoo.com> | 2017-09-27 11:23:56 +0200 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2017-09-27 13:50:07 +0200 |
| commit | f49d758665938ed7cbb9f46221ba8f0663def514 (patch) | |
| tree | fd43a08d9c17499189d3c8f5ac167ef2ca464899 /addons/web/static/src/js/views/basic/basic_model.js | |
| parent | b53ce01b16792724271a610bf07ea119fd798343 (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.js | 33 |
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; }, /** |
