Hi, everyone!
In odoo17, I tried to open a popup window using a client action. Here‘s the code:
client action definition in view xml:
<record id="estate_lease_contract_terminate_popup" model="ir.actions.client">
<field name="name">Confirm Terminate</field>
<field name="tag">estate_lease_contract.contract_terminate_dialog</field>
<field name="target">new</field>
</record>
static xml source for popup window:
<?xml version="1.0" encoding="utf-8"?>
<templates xml:space="preserve">
<t t-name="estate_lease_contract.ContractTerminateAction">
<div class="ms-1 mt-1">
<div class="align-self-center" style="display: flex; justify-content: center;">
<div>
<span>Please confirm the following jobs done, then click "Terminate" btton!</span>
<t t-foreach="terminate_todo_list" t-as="todo" t-key="todo.id">
<TodoItem todo="todo" toggleState.bind="toggleTodo" removeTodo.bind="removeTodo"/>
</t>
</div>
</div>
<div class="align-self-center" style="display: flex; justify-content: center;">
<div class="col-sm-5 mt16" style="display: flex; justify-content: center;">
<button class="btn btn-primary mb16" t-on-click="() => this.onClickTerminateContract()" t-att-disabled="this.confirm_button_disable()">
<div class="mb16 mt16">Terminate</div>
</button>
</div>
</div>
</div>
</t>
</templates>
static js source for popup window:
/** @odoo-module */
import {Component, useState} from "@odoo/owl";
import { registry } from "@web/core/registry";
import {useService} from "@web/core/utils/hooks";
import {TodoItem} from "./todo_item";
let todo_list = [
'Job A done!',
'Job B done!',
'Job C done!',
]
export class EstateLeaseContractTerminate extends Component {
static template = "estate_lease_contract.ContractTerminateAction";
static components = { TodoItem };
setup() {
this.action = useService("action");
this.terminate_todo_list = useState([]);
let i = 0;
for (const todo_c of todo_list) {
this.terminate_todo_list.push({
id: i,
description: todo_c,
isCompleted: false
});
i++;
}
if (this.footer) {
this.footer.destroy();
}
}
toggleTodo(todoId) {
const todo = this.terminate_todo_list.find((todo) => todo.id === todoId);
if (todo) {
todo.isCompleted = !todo.isCompleted;
}
}
removeTodo(todoId) {
const todoIndex = this.terminate_todo_list.findIndex((todo) => todo.id === todoId);
if (todoIndex >= 0) {
this.terminate_todo_list.splice(todoIndex, 1);
}
}
confirm_button_disable(){
for (const each_todo of this.terminate_todo_list) {
if (!each_todo.isCompleted) {
return true;
}
}
return false;
}
getURLParams() {
const urlParams = new URLSearchParams(window.location.hash.substring(1));
console.log(urlParams);
console.log(urlParams.get('id'));
const params = {};
urlParams.forEach((value, key) => {
params[key] = value;
});
console.log(params);
console.log(params['id']);
return params;
}
onClickTerminateContract(){
const params = this.getURLParams();
console.log(params);
console.log(params['id']);
this.action.doAction("estate_lease_contract.estate_lease_contract_terminate_svr_action",
{additionalContext: params});
}
}
registry.category("actions").add("estate_lease_contract.contract_terminate_dialog", EstateLeaseContractTerminate);
Through out the source code above, the default 'OK' button always displays in the popup window. How to hide the default 'OK' button in the footer of the popup window?
I have tried the following methods, but the default ok button is still there...
- adding params to the client action definition as below:<field name="params" eval=""{'flags': {'form': {'action_buttons': False}}}""/>
- adding destroy in js setup() method: if (this.footer) {this.footer.destroy();}
- adding xpath expr="//footer" position="inside" to the view xml, but compile exception happend while server starting up because of "xml file does not fit the required schema! " or "Invalid field 'arch' on model 'ir.actions.client'"
Is it possible to hide the default button in client popup window ?