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",