diff --git a/addons/web/static/src/views/basic_relational_model.js b/addons/web/static/src/views/basic_relational_model.js index 3a1f55ccd0d..23f9ce90196 100644 --- a/addons/web/static/src/views/basic_relational_model.js +++ b/addons/web/static/src/views/basic_relational_model.js @@ -1233,14 +1233,16 @@ export class RelationalModel extends Model { return newRecord; } - async addNewRecord(list, params) { + async addNewRecord(list, params, withParentId = true) { const parentId = this.__bm__.localData[list.__bm_handle__].parentID; const fieldName = list.__fieldName__; const context = this.__bm__._getContext(this.__bm__.localData[parentId], { fieldName }); params.context = makeContext([context, params.context]); params.__syncParent = () => list.__syncData(); const newRecord = this.createDataPoint("record", params); - newRecord.__bm_load_params__.parentID = list.__bm_handle__; + if (withParentId) { + newRecord.__bm_load_params__.parentID = list.__bm_handle__; + } await newRecord.load(); return newRecord; } diff --git a/addons/web/static/src/views/fields/relational_utils.js b/addons/web/static/src/views/fields/relational_utils.js index 9ec84a605b9..2aaf8c000dd 100644 --- a/addons/web/static/src/views/fields/relational_utils.js +++ b/addons/web/static/src/views/fields/relational_utils.js @@ -561,6 +561,7 @@ export function useOpenX2ManyRecord({ getList, updateRecord, saveRecord, + withParentId, }) { const viewService = useService("view"); const userService = useService("user"); @@ -601,7 +602,7 @@ export function useOpenX2ManyRecord({ mode: "edit", viewType: "form", }; - record = await model.addNewRecord(list, recordParams); + record = await model.addNewRecord(list, recordParams, withParentId); } addDialog( @@ -617,15 +618,19 @@ export function useOpenX2ManyRecord({ await saveRecord(rec); } if (saveAndNew) { - return model.addNewRecord(list, { - context: list.context, - resModel: resModel, - activeFields: form.activeFields, - fields: { ...form.fields }, - views: { form }, - mode: "edit", - viewType: "form", - }); + return model.addNewRecord( + list, + { + context: list.context, + resModel: resModel, + activeFields: form.activeFields, + fields: { ...form.fields }, + views: { form }, + mode: "edit", + viewType: "form", + }, + withParentId + ); } }, title, diff --git a/addons/web/static/src/views/fields/x2many/x2many_field.js b/addons/web/static/src/views/fields/x2many/x2many_field.js index bcc5361bdde..5eb33ef5f79 100644 --- a/addons/web/static/src/views/fields/x2many/x2many_field.js +++ b/addons/web/static/src/views/fields/x2many/x2many_field.js @@ -67,6 +67,7 @@ export class X2ManyField extends Component { getList: () => this.list, saveRecord, updateRecord, + withParentId: this.activeField.widget !== "many2many", }); this._openRecord = (params) => { const activeElement = document.activeElement; 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 3f4bc49f5c8..8d22e49da8b 100644 --- a/addons/web/static/tests/views/fields/many2many_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_field_tests.js @@ -12,6 +12,7 @@ import { getNodesTextContent, nextTick, patchWithCleanup, + addRow, } from "@web/../tests/helpers/utils"; import { editSearch, validateSearch } from "@web/../tests/search/helpers"; import { Many2XAutocomplete } from "@web/views/fields/relational_utils"; @@ -1564,6 +1565,59 @@ QUnit.module("Fields", (hooks) => { assert.verifySteps([]); }); + QUnit.test( + "many2many widget: creates a new record with a context containing the parentID", + async function (assert) { + serverData.views = { + "turtle,false,list": '', + "turtle,false,search": '', + "turtle,false,form": + '
', + }; + + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+ + + + + +
`, + resId: 1, + mockRPC(route, args) { + const { method, kwargs } = args; + assert.step(method); + if (method === "onchange") { + assert.strictEqual(kwargs.context.default_turtle_trululu, 1); + assert.deepEqual(args.args, [ + [], + {}, + [], + { + turtle_trululu: "", + }, + ]); + } + }, + }); + assert.verifySteps(["get_views", "read", "read"]); + + await addRow(target); + assert.verifySteps(["get_views", "web_search_read"]); + + await click(target, ".o_create_button"); + assert.strictEqual( + target.querySelector("[name='turtle_trululu'] input").value, + "first record" + ); + assert.verifySteps(["get_views", "onchange"]); + } + ); + QUnit.test("onchange with 40+ commands for a many2many", async function (assert) { // this test ensures that the basic_model correctly handles more LINK_TO // commands than the limit of the dataPoint (40 for x2many kanban)