Odoo18-Base/addons/board/static/src/board_view.js
2025-01-06 10:57:38 +07:00

76 lines
2.6 KiB
JavaScript

/** @odoo-module **/
import { registry } from "@web/core/registry";
import { BoardController } from "./board_controller";
import { visitXML } from "@web/core/utils/xml";
import { Domain } from "@web/core/domain";
export class BoardArchParser {
parse(arch, customViewId) {
let nextId = 1;
const archInfo = {
title: null,
layout: null,
colNumber: 0,
isEmpty: true,
columns: [{ actions: [] }, { actions: [] }, { actions: [] }],
customViewId,
};
let currentIndex = -1;
visitXML(arch, (node) => {
switch (node.tagName) {
case "form":
archInfo.title = node.getAttribute("string");
break;
case "board":
archInfo.layout = node.getAttribute("style");
archInfo.colNumber = archInfo.layout.split("-").length;
break;
case "column":
currentIndex++;
break;
case "action": {
archInfo.isEmpty = false;
const isFolded = Boolean(
node.hasAttribute("fold") ? parseInt(node.getAttribute("fold"), 10) : 0
);
const action = {
id: nextId++,
title: node.getAttribute("string"),
actionId: parseInt(node.getAttribute("name"), 10),
viewMode: node.getAttribute("view_mode"),
context: node.getAttribute("context"),
isFolded,
};
if (node.hasAttribute("domain")) {
const domain = node.getAttribute("domain");
action.domain = new Domain(domain).toList();
// so it can be serialized when reexporting board xml
action.domain.toString = () => node.getAttribute("domain");
}
archInfo.columns[currentIndex].actions.push(action);
break;
}
}
});
return archInfo;
}
}
export const boardView = {
type: "form",
Controller: BoardController,
props: (genericProps, view) => {
const { arch, info } = genericProps;
const board = new BoardArchParser().parse(arch, info.customViewId);
return {
...genericProps,
className: "o_dashboard",
board,
};
},
};
registry.category("views").add("board", boardView);