diff --git a/addons/web/static/src/views/fields/relational_utils.js b/addons/web/static/src/views/fields/relational_utils.js index 9e6d855dc9a..2a41ca35c98 100644 --- a/addons/web/static/src/views/fields/relational_utils.js +++ b/addons/web/static/src/views/fields/relational_utils.js @@ -752,13 +752,16 @@ export function useOpenX2ManyRecord({ export function useX2ManyCrud(getList, isMany2Many) { let saveRecord; if (isMany2Many) { - saveRecord = (object) => { + saveRecord = async (object) => { const list = getList(); const currentIds = list.currentIds; let resIds; if (Array.isArray(object)) { resIds = [...currentIds, ...object]; } else if (object.resId) { + if (object.isDirty) { + await object.save(); + } resIds = [...currentIds, object.resId]; } else { return list.add(object, { isM2M: isMany2Many }); diff --git a/addons/web/static/tests/views/fields/many2many_field_tests.js b/addons/web/static/tests/views/fields/many2many_field_tests.js index 3f77e695226..0c4a911a810 100644 --- a/addons/web/static/tests/views/fields/many2many_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_field_tests.js @@ -740,16 +740,18 @@ QUnit.module("Fields", (hooks) => { ["Save & Close", "Save & New", "Discard"] ); + await editInput(modal, "[name='display_name'] input", "Hello (edited)"); + await click(modal.querySelector(".modal-footer button")); assert.containsNone(target, ".modal"); assert.deepEqual( [...target.querySelectorAll("[name='timmy'] .o_data_row")].map( (row) => row.textContent ), - ["Hello"] + ["Hello (edited)"] ); - assert.verifySteps(["create", "read", "action: myaction", "read"]); + assert.verifySteps(["create", "read", "action: myaction", "write", "read", "read"]); } );