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 93c0dd7c40c..fd47e931317 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1119,6 +1119,7 @@ var BasicModel = AbstractModel.extend({ list_records[record.id].data = record; self._parseServerData(fieldNames, list.fields, record); }); + return self._fetchX2ManysBatched(list); }); defs.push(def); } @@ -1645,11 +1646,21 @@ var BasicModel = AbstractModel.extend({ var fieldsInfo = view ? view.fieldsInfo : fieldInfo.fieldsInfo; var fields = view ? view.fields : fieldInfo.relatedFields; var viewType = view ? view.type : fieldInfo.viewType; + var data = list._changes || list.data; + var x2mRecords = []; // step 1: collect ids var ids = []; - _.each(list.data, function (dataPoint) { + _.each(data, function (dataPoint) { var record = self.localData[dataPoint]; + if (typeof record.data[fieldName] === 'string') { + // in this case, the value is a local ID, which means that the + // record has already been processed. It can happen for example + // when a user adds a record in a m2m relation, or loads more + // records in a kanban column + return; + } + x2mRecords.push(record); ids = _.unique(ids.concat(record.data[fieldName] || [])); var m2mList = self._makeDataPoint({ fieldsInfo: fieldsInfo, @@ -1696,8 +1707,7 @@ var BasicModel = AbstractModel.extend({ }); }); - _.each(list.data, function (dataPoint) { - var record = self.localData[dataPoint]; + _.each(x2mRecords, function (record) { var m2mList = self.localData[record.data[fieldName]]; m2mList.data = []; diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 0629dfc4da1..4e455b290fa 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -3390,6 +3390,79 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('many2many list with x2many: add a record', function (assert) { + assert.expect(18); + + this.data.partner_type.fields.m2m = { + string: "M2M", type: "many2many", relation: 'turtle', + }; + this.data.partner_type.records[0].m2m = [1, 2]; + this.data.partner_type.records[1].m2m = [2, 3]; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'
', + res_id: 1, + archs: { + 'partner_type,false,list': '