diff --git a/addons/web/static/src/views/list/list_controller.js b/addons/web/static/src/views/list/list_controller.js index 7aa5462d6b3..800f20b45a1 100644 --- a/addons/web/static/src/views/list/list_controller.js +++ b/addons/web/static/src/views/list/list_controller.js @@ -202,7 +202,7 @@ export class ListController extends Component { async createRecord({ group } = {}) { const list = (group && group.list) || this.model.root; - if (this.editable) { + if (this.editable && !list.isGrouped) { if (!(list instanceof DynamicRecordList)) { throw new Error("List should be a DynamicRecordList"); } diff --git a/addons/web/static/src/views/list/list_controller.xml b/addons/web/static/src/views/list/list_controller.xml index 6914716996d..a9066f1f0f0 100644 --- a/addons/web/static/src/views/list/list_controller.xml +++ b/addons/web/static/src/views/list/list_controller.xml @@ -5,7 +5,7 @@
- + diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index 39dcdfef094..8c1d67ebbb7 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -2861,10 +2861,10 @@ QUnit.module("Views", (hooks) => { await toggleSearchBarMenu(target); await toggleMenuItem(target, "candle"); - assert.containsNone( + assert.containsOnce( target, - ".o_list_button_add", - "Create not available as list is grouped" + ".o_list_button_add:visible", + "Create available as list is grouped" ); assert.containsNone( target, @@ -2874,6 +2874,47 @@ QUnit.module("Views", (hooks) => { } ); + QUnit.test( + "editable list view: check that add button is present when groupby applied", + async function (assert) { + assert.expect(4); + + serverData.models.foo.fields.foo = { string: "Foo", type: "char", required: true }; + serverData.actions = { + 11: { + id: 11, + name: "Partners Action 11", + res_model: "foo", + type: "ir.actions.act_window", + views: [[3, "list"], [4, "form"]], + search_view_id: [9, "search"], + } + }; + serverData.views = { + "foo,3,list": + '', + "foo,4,form": + '
', + "foo,9,search": ` + + + `, + }; + + const webClient = await createWebClient({ serverData }); + await doAction(webClient, 11); + + assert.containsOnce(target, ".o_list_button_add:visible"); + await click(target.querySelector(".o_searchview_dropdown_toggler")); + await click($(target).find('.o_menu_item:contains("candle")')[0]); + assert.containsOnce(target, ".o_list_button_add:visible"); + + assert.containsOnce(target, ".o_list_view"); + await click($(".o_list_button_add:visible").get(0)); + assert.containsOnce(target, ".o_form_view"); + } + ); + QUnit.test("list view not groupable", async function (assert) { serverData.views = { "foo,false,search": ` @@ -13461,7 +13502,7 @@ QUnit.module("Views", (hooks) => { await toggleSearchBarMenu(target); await toggleMenuItem(target, "bar"); - assert.containsNone(target, ".o_list_button_add"); + assert.containsOnce(target, ".o_list_button_add:visible"); // reload without groupby await toggleMenuItem(target, "bar");