diff --git a/addons/web/static/src/views/kanban/kanban_controller.js b/addons/web/static/src/views/kanban/kanban_controller.js index 3a7d65e017f..2b96c845534 100644 --- a/addons/web/static/src/views/kanban/kanban_controller.js +++ b/addons/web/static/src/views/kanban/kanban_controller.js @@ -96,10 +96,12 @@ export class KanbanController extends Component { } get canCreate() { - if (!this.model.root.isGrouped) { - return this.props.archInfo.activeActions.create; + const { create, groupCreate } = this.props.archInfo.activeActions; + const list = this.model.root; + if (!create) { + return false; } - return !this.props.archInfo.activeActions.groupCreate || this.model.root.groups.length > 0; + return list.isGrouped ? list.groups.length > 0 || !groupCreate : true; } } diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index f32c3f9d223..559c021cb85 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -4608,6 +4608,25 @@ QUnit.module("Views", (hooks) => { assert.containsNone(target, ".o-kanban-button-new"); }); + QUnit.test("kanban view with create=False and groupby", async (assert) => { + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` + + + > +
> +
+
+
`, + groupBy: ["product_id"], + }); + + assert.containsNone(target, ".o-kanban-button-new"); + }); + QUnit.test("clicking on a link triggers correct event", async (assert) => { await makeView({ type: "kanban", @@ -10446,12 +10465,12 @@ QUnit.module("Views", (hooks) => { QUnit.test( "Color '200' (gray) can be used twice (for false value and another value) in progress bar", async (assert) => { - serverData.models.partner.records.push({ id: 5, bar: true }, { id: 6, bar: false }); - await makeView({ - type: "kanban", - resModel: "partner", - serverData, - arch: ` + serverData.models.partner.records.push({ id: 5, bar: true }, { id: 6, bar: false }); + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: ` @@ -10465,56 +10484,57 @@ QUnit.module("Views", (hooks) => { `, - groupBy: ["bar"], - }); + groupBy: ["bar"], + }); - assert.containsN(target, ".o_kanban_group:nth-child(1) .progress-bar", 2); - assert.deepEqual( - [...target.querySelectorAll(".o_kanban_group:nth-child(1) .progress-bar")].map( - (el) => el.dataset.tooltip - ), - ["1 blip", "1 Other"] - ); - assert.containsN(target, ".o_kanban_group:nth-child(2) .progress-bar", 4); - assert.deepEqual( - [...target.querySelectorAll(".o_kanban_group:nth-child(2) .progress-bar")].map( - (el) => el.dataset.tooltip - ), - ["1 yop", "1 gnap", "1 blip", "1 Other"] - ); - assert.deepEqual(getCounters(), ["2", "4"]); + assert.containsN(target, ".o_kanban_group:nth-child(1) .progress-bar", 2); + assert.deepEqual( + [...target.querySelectorAll(".o_kanban_group:nth-child(1) .progress-bar")].map( + (el) => el.dataset.tooltip + ), + ["1 blip", "1 Other"] + ); + assert.containsN(target, ".o_kanban_group:nth-child(2) .progress-bar", 4); + assert.deepEqual( + [...target.querySelectorAll(".o_kanban_group:nth-child(2) .progress-bar")].map( + (el) => el.dataset.tooltip + ), + ["1 yop", "1 gnap", "1 blip", "1 Other"] + ); + assert.deepEqual(getCounters(), ["2", "4"]); - await click(target.querySelector(".o_kanban_group:nth-child(2) .progress-bar")); + await click(target.querySelector(".o_kanban_group:nth-child(2) .progress-bar")); - assert.deepEqual(getCounters(), ["2", "1"]); - assert.strictEqual( - target.querySelector(".o_kanban_group:nth-child(2) .o_kanban_record").innerText, - "ABC" - ); - assert.containsNone(target, ".o_kanban_group:nth-child(2) .o_kanban_load_more"); + assert.deepEqual(getCounters(), ["2", "1"]); + assert.strictEqual( + target.querySelector(".o_kanban_group:nth-child(2) .o_kanban_record").innerText, + "ABC" + ); + assert.containsNone(target, ".o_kanban_group:nth-child(2) .o_kanban_load_more"); - await click( - target.querySelector(".o_kanban_group:nth-child(2) .progress-bar:nth-child(2)") - ); + await click( + target.querySelector(".o_kanban_group:nth-child(2) .progress-bar:nth-child(2)") + ); - assert.deepEqual(getCounters(), ["2", "1"]); - assert.strictEqual( - target.querySelector(".o_kanban_group:nth-child(2) .o_kanban_record").innerText, - "GHI" - ); - assert.containsNone(target, ".o_kanban_group:nth-child(2) .o_kanban_load_more"); + assert.deepEqual(getCounters(), ["2", "1"]); + assert.strictEqual( + target.querySelector(".o_kanban_group:nth-child(2) .o_kanban_record").innerText, + "GHI" + ); + assert.containsNone(target, ".o_kanban_group:nth-child(2) .o_kanban_load_more"); - await click( - target.querySelector(".o_kanban_group:nth-child(2) .progress-bar:nth-child(4)") - ); + await click( + target.querySelector(".o_kanban_group:nth-child(2) .progress-bar:nth-child(4)") + ); - assert.deepEqual(getCounters(), ["2", "1"]); - assert.strictEqual( - target.querySelector(".o_kanban_group:nth-child(2) .o_kanban_record").innerText, - "" - ); - assert.containsNone(target, ".o_kanban_group:nth-child(2) .o_kanban_load_more"); - }); + assert.deepEqual(getCounters(), ["2", "1"]); + assert.strictEqual( + target.querySelector(".o_kanban_group:nth-child(2) .o_kanban_record").innerText, + "" + ); + assert.containsNone(target, ".o_kanban_group:nth-child(2) .o_kanban_load_more"); + } + ); QUnit.test( "keep focus inside control panel when pressing arrowdown and no kanban card",