diff --git a/addons/web/static/src/views/kanban/kanban_renderer.js b/addons/web/static/src/views/kanban/kanban_renderer.js index e3ad7aaf991..650030545f9 100644 --- a/addons/web/static/src/views/kanban/kanban_renderer.js +++ b/addons/web/static/src/views/kanban/kanban_renderer.js @@ -217,7 +217,7 @@ export class KanbanRenderer extends Component { .sort((a, b) => (a.value && !b.value ? 1 : !a.value && b.value ? -1 : 0)) .map((group, i) => ({ group, - key: `group_key_${isNull(group.value) ? i : String(group.value)}`, + key: isNull(group.value) ? `group_key_${i}` : String(group.value), })); } else { return list.records.map((record) => ({ record, key: record.id })); diff --git a/addons/web/static/tests/views/kanban_view_tests.js b/addons/web/static/tests/views/kanban_view_tests.js index a7f77960c13..104c1e29937 100644 --- a/addons/web/static/tests/views/kanban_view_tests.js +++ b/addons/web/static/tests/views/kanban_view_tests.js @@ -12061,4 +12061,59 @@ QUnit.module("Views", (hooks) => { assert.deepEqual(getCardTexts(), ["1", "3", "4", "2"]); }); + + QUnit.test("group key in foreach cannot be a duplicate", async function (assert) { + serverData.models.product.records = [ + { + id: 1, + name: "Product with id 1", + }, + ]; + + serverData.models.partner.records = [ + { + id: 1, + name: "Partner 1", + product_id: 1, + }, + ]; + + await makeView({ + type: "kanban", + resModel: "partner", + serverData, + arch: /* xml */ ` + + +
+ +
+
+
+ `, + groupBy: ["product_id"], + async mockRPC(route, args, performRPC) { + if (args.method === "web_read_group") { + const result = await performRPC(route, args); + result.groups = [ + ...result.groups, + { + // Add an empty and valueless group, will result in foreach key group_key_0 + __domain: [["product_id", "=", null]], + __fold: false, + }, + { + // Add an empty and valueless group, will result in foreach key group_key_1 + __domain: [["product_id", "=", null]], + __fold: false, + }, + ]; + result.length = 2; + return result; + } + }, + }); + assert.strictEqual(target.querySelectorAll(".o_kanban_group").length, 3); + assert.strictEqual(target.querySelectorAll(".o_kanban_record").length, 1); + }); });