summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/views/basic
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/src/js/views/basic')
-rw-r--r--addons/web/static/src/js/views/basic/basic_model.js37
1 files changed, 33 insertions, 4 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 87c9f3c57bc..62898a338bd 100644
--- a/addons/web/static/src/js/views/basic/basic_model.js
+++ b/addons/web/static/src/js/views/basic/basic_model.js
@@ -825,7 +825,6 @@ var BasicModel = AbstractModel.extend({
_applyChange: function (recordID, changes) {
var self = this;
var record = this.localData[recordID];
- var onChangeFields = []; // the fields that have changed and that have an on_change
var field;
var defs = [];
record._changes = record._changes || {};
@@ -840,12 +839,19 @@ var BasicModel = AbstractModel.extend({
} else {
record._changes[fieldName] = changes[fieldName];
}
- if (field.onChange) {
- onChangeFields.push(fieldName);
- }
}
return $.when.apply($, defs).then(function () {
+ var onChangeFields = []; // the fields that have changed and that have an on_change
+ for (var fieldName in changes) {
+ field = record.fields[fieldName];
+ if (field.onChange) {
+ var isX2Many = field.type === 'one2many' || field.type === 'many2many';
+ if (!isX2Many || (self._isX2ManyValid(record._changes[fieldName] || record.data[fieldName]))) {
+ onChangeFields.push(fieldName);
+ }
+ }
+ }
var onchangeDef;
if (onChangeFields.length) {
onchangeDef = self._performOnChange(record, onChangeFields).then(function (result) {
@@ -1949,6 +1955,29 @@ var BasicModel = AbstractModel.extend({
return Object.keys(fieldsInfo && fieldsInfo[element.viewType] || {});
},
/**
+ * return true if a list element is 'valid'. Such an element is valid if it
+ * has no sub record with an unset required field.
+ *
+ * This method is meant to be used to check if a x2many change will trigger
+ * an onchange.
+ *
+ * @param {string} id id for a local resource of type 'list'. This is
+ * assumed to be a list element for a one2many
+ * @returns {boolean}
+ */
+ _isX2ManyValid: function (id) {
+ var isValid = true;
+ var element = this.get(id, {raw: true});
+ _.each(element.data, function (rec) {
+ for (var fieldName in rec.fields) {
+ if (rec.fields[fieldName].required && !rec.data[fieldName]) {
+ isValid = false;
+ }
+ }
+ });
+ return isValid;
+ },
+ /**
* Helper method for the load entry point.
*
* @see load