From 776bac6a069fc1ef2d6bea0e85a0737e3cefecef Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Sat, 30 Sep 2017 10:50:41 +0200 Subject: [FIX] web: don't discard x2many rows coming from default_get Problem occured in the MRP Production wizard (with a consumed product tracked by serial number). The opened record is a new record, and its one2many has 2 default rows that are prefilled. If the user edited one of the quantities in those rows, and set an invalid value instead (e.g. a letter), the row was removed without notice when it was focused out. This was because the model wasn't aware that a change has been done on the record, and as the record was flagged as new, it was simply abandonned. --- addons/web/static/src/js/views/basic/basic_controller.js | 9 +++++++++ addons/web/static/src/js/views/basic/basic_model.js | 11 +++++++++++ 2 files changed, 20 insertions(+) (limited to 'addons/web/static/src/js/views/basic') diff --git a/addons/web/static/src/js/views/basic/basic_controller.js b/addons/web/static/src/js/views/basic/basic_controller.js index 481fc0cf4dd..c899530de07 100644 --- a/addons/web/static/src/js/views/basic/basic_controller.js +++ b/addons/web/static/src/js/views/basic/basic_controller.js @@ -19,6 +19,7 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { custom_events: _.extend({}, AbstractController.prototype.custom_events, FieldManagerMixin.custom_events, { discard_changes: '_onDiscardChanges', reload: '_onReload', + set_dirty: '_onSetDirty', sidebar_data_asked: '_onSidebarDataAsked', translate: '_onTranslate', }), @@ -553,6 +554,14 @@ var BasicController = AbstractController.extend(FieldManagerMixin, { }); } }, + /** + * @private + * @param {OdooEvent} ev + */ + _onSetDirty: function (ev) { + ev.stopPropagation(); // prevent other controllers from handling this request + this.model.setDirty(ev.data.dataPointID); + }, /** * Handler used to get all the data necessary when a custom action is * performed through the sidebar. 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 9e7fb8b78ef..57c4a1f3743 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -947,6 +947,17 @@ var BasicModel = AbstractModel.extend({ record.fields = _.defaults(record.fields, viewInfo.fields); record.fieldsInfo = _.defaults(record.fieldsInfo, viewInfo.fieldsInfo); }, + /** + * Manually sets a resource as dirty. This is used to notify that a field + * has been modified, but with an invalid value. In that case, the value is + * not sent to the basic model, but the record should still be flagged as + * dirty so that it isn't discarded without any warning. + * + * @param {string} id a resource id + */ + setDirty: function (id) { + this.localData[id]._isDirty = true; + }, /** * For list resources, this changes the orderedBy key. * -- cgit v1.2.3