[FIX] web: Use kanban-menu template in arch kanban_arch_parser

This commit modifies the way kanban_arch_parser retrieves `colorField`.

Previously, the parser tried to retrieve only `colorField`
(the `data-field` attribute of `.oe_kanban_colorpicker`) from `kanban-box`.
Except that in most cases `.oe_kanban_colorpicker` is defined in
`kanban-menu` and not `kanban-box`.

for example:

https://github.com/odoo/odoo/blob/31107fb4cc9cf5dc2da21cbfef58dae722c73922/addons/crm/views/crm_lead_views.xml#L554-L559
https://github.com/odoo/odoo/blob/c6978c3fc4f828d970d45ebdaa4a35b44f3d09ce/addons/project/views/project_task_views.xml#L544-L550
https://github.com/odoo/odoo/blob/c6978c3fc4f828d970d45ebdaa4a35b44f3d09ce/addons/project_todo/views/project_task_views.xml#L28-L31
etc.

As a result, this code was always ignored and we always fallbacked on `||"color"`.
```js
 const colorField = (colorEl && colorEl.getAttribute("data-field")) || "color";
```

Now `KanbanArchParser` checks both `kanban-box` and `kanban-menu` and
finally fallbacks to `color`.

Part-of: odoo/odoo#161645
This commit is contained in:
Achraf
2024-04-17 22:47:12 +00:00
committed by Achraf (abz)
parent 0d5f278067
commit 9fd3fc5889
2 changed files with 37 additions and 1 deletions
@@ -154,7 +154,7 @@ export class KanbanArchParser {
const cardColorEl = cardDoc.querySelector("[color]");
const cardColorField = cardColorEl && cardColorEl.getAttribute("color");
const colorEl = cardDoc.querySelector(".oe_kanban_colorpicker[data-field]");
const colorEl = xmlDoc.querySelector("templates .oe_kanban_colorpicker[data-field]");
const colorField = (colorEl && colorEl.getAttribute("data-field")) || "color";
if (!defaultOrder.length && handleField) {
@@ -0,0 +1,36 @@
/** @odoo-module **/
import { KanbanArchParser } from "@web/views/kanban/kanban_arch_parser";
import { parseXML } from "@web/core/utils/xml";
function parseArch(arch, options = {}) {
const parser = new KanbanArchParser();
const xmlDoc = parseXML(arch);
return parser.parse(xmlDoc, { fake: {name: { string: "Name", type: "char" },} }, "fake");
}
QUnit.module("KanbanView - ArchParser");
QUnit.test("oe_kanban_colorpicker in kanban-menu and kanban-box", (assert) => {
const archInfo = parseArch(`
<kanban>
<templates>
<t t-name="kanban-menu">
<ul class="oe_kanban_colorpicker" data-field="kanban_menu_colorpicker" role="menu"/>
</t>
<t t-name="kanban-box"/>
</templates>
</kanban>
`);
assert.strictEqual(archInfo.colorField, "kanban_menu_colorpicker", "colorField should be 'kanban_menu_colorpicker'");
const archInfo_1 = parseArch(`
<kanban>
<templates>
<t t-name="kanban-menu"/>
<t t-name="kanban-box">
<ul class="oe_kanban_colorpicker" data-field="kanban_box_color" role="menu"/>
</t>
</templates>
</kanban>
`);
assert.strictEqual(archInfo_1.colorField, "kanban_box_color", "colorField should be 'kanban_box_color'");
});