summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2017-05-05 10:58:10 +0200
committerAaron Bohy <aab@odoo.com>2017-05-05 13:31:46 +0200
commite8f9bb683d958f0a7efa1e42a53633b72150c32f (patch)
tree956bc774f379e1c23db14ffba59b89998025d1fb /addons/web/static/src
parent47305199a85d896b8e0b757444b8a7d7bc10e619 (diff)
[FIX] web: DebouncedField: notify changes only when changed
Before this rev., if you opened a form view with, e.g. a float field, that is unset, and then click on edit, then save, it actually saved the new value for the float field (being 0), whereas it shouldn't do any RPC as nothing changed. This is because the former code couldn't detect if the value "0" in the input is there because the field is still unset or if the user simply set it to 0.
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/fields/basic_fields.js10
1 files changed, 9 insertions, 1 deletions
diff --git a/addons/web/static/src/js/fields/basic_fields.js b/addons/web/static/src/js/fields/basic_fields.js
index 0cb7742ffa1..3c818089d32 100644
--- a/addons/web/static/src/js/fields/basic_fields.js
+++ b/addons/web/static/src/js/fields/basic_fields.js
@@ -91,6 +91,13 @@ var DebouncedField = AbstractField.extend({
init: function () {
this._super.apply(this, arguments);
+ // isDirty is used to detect that the user interacted at least once with
+ // the widget, so that we can prevent it from triggering a field_changed
+ // in commitChanges if the user didn't change anything (this is required
+ // as sometimes it is hard to detect that an unset value is still unset,
+ // e.g. if a numerical field contains the value 0, is it because it is
+ // still unset or because the user set it to 0?
+ this.isDirty = false;
if (this.DEBOUNCE && this.mode === 'edit') {
this._doDebouncedAction = _.debounce(this._doDebouncedAction.bind(this), this.DEBOUNCE);
}
@@ -108,7 +115,7 @@ var DebouncedField = AbstractField.extend({
* @override
*/
commitChanges: function () {
- if (this.mode === 'edit') {
+ if (this.isDirty && this.mode === 'edit') {
this._setValue(this._getValue());
}
},
@@ -158,6 +165,7 @@ var DebouncedField = AbstractField.extend({
* @private
*/
_onInput: function () {
+ this.isDirty = true;
this._doDebouncedAction();
},
});