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

93 lines
3.6 KiB
JavaScript

/** @odoo-module **/
import { rpc } from "@web/core/network/rpc";
import { useService } from "@web/core/utils/hooks";
import { View } from "@web/views/view";
import { makeContext } from "@web/core/context";
import { user } from "@web/core/user";
import { Component, onWillStart } from "@odoo/owl";
export class BoardAction extends Component {
static template = "board.BoardAction";
static components = { View };
static props = {
action: Object,
actionId: { type: Number, optional: true },
className: { type: String, optional: true },
};
static cache = {};
setup() {
this.actionService = useService("action");
const action = this.props.action;
this.formViewId = false;
this.isValid = true;
onWillStart(async () => {
let result = BoardAction.cache[action.actionId];
if (!result) {
result = await rpc("/web/action/load", { action_id: action.actionId });
BoardAction.cache[action.actionId] = result;
}
if (!result) {
// action does not exist
this.isValid = false;
return;
}
const viewMode = action.viewMode || result.views[0][1];
const formView = result.views.find((v) => v[1] === "form");
if (formView) {
this.formViewId = formView[0];
}
this.viewProps = {
resModel: result.res_model,
type: viewMode,
display: { controlPanel: false },
selectRecord: (resId) => this.selectRecord(result.res_model, resId),
};
const view = result.views.find((v) => v[1] === viewMode);
if (view) {
this.viewProps.viewId = view[0];
}
const searchView = result.views.find((v) => v[1] === "search");
this.viewProps.views = [
[this.viewProps.viewId || false, viewMode],
[(searchView && searchView[0]) || false, "search"],
];
if (action.context) {
this.viewProps.context = makeContext([action.context, { lang: user.context.lang }]);
if ("group_by" in this.viewProps.context) {
const groupBy = this.viewProps.context.group_by;
this.viewProps.groupBy = typeof groupBy === "string" ? [groupBy] : groupBy;
}
if ("comparison" in this.viewProps.context) {
const comparison = this.viewProps.context.comparison;
if (
comparison !== null &&
typeof comparison === "object" &&
"domains" in comparison &&
"fieldName" in comparison
) {
// Some comparison object with the wrong form might have been stored in db.
// This is why we make the checks on the keys domains and fieldName
this.viewProps.comparison = comparison;
}
}
}
if (action.domain) {
this.viewProps.domain = action.domain;
}
if (viewMode === "list") {
this.viewProps.allowSelectors = false;
}
});
}
selectRecord(resModel, resId) {
this.actionService.doAction({
type: "ir.actions.act_window",
res_model: resModel,
views: [[this.formViewId, "form"]],
res_id: resId,
});
}
}