display empty action when invalid tag for client action

This commit is contained in:
Géry Debongnie
2019-03-06 09:56:39 +01:00
parent 859e29a7ac
commit 9dffcf4cf6
4 changed files with 54 additions and 7 deletions
@@ -117,17 +117,17 @@ export function actionManagerMixin<T extends ReturnType<typeof rpcMixin>>(
descr: ClientActionDescription
): Action["executor"] | undefined {
let key = descr.tag;
let Widget = this.actionRegistry.get(key);
if (!Widget) {
let ActionWidget = this.actionRegistry.get(key);
if (!ActionWidget) {
this.addNotification({
title: "Invalid Client Action",
type: "warning",
message: `Cannot find widget '${key}' in the action registry`
});
return;
ActionWidget = Widget;
}
return async function executor(this: Action, parent: Widget<any, any>) {
const widget = new Widget!(parent, {});
const widget = new ActionWidget!(parent, {});
const div = document.createElement("div");
await widget.mount(div);
this.widget = widget;
+1 -3
View File
@@ -24,9 +24,7 @@ export class Root extends Widget<Store, State> {
}
mounted() {
this.store.on("state_updated", this, newState => {
this.updateState(newState);
});
this.store.on("state_updated", this, this.updateState);
// loading indicator
this.store.on("rpc_status", this, status => {
@@ -34,6 +34,40 @@ exports[`can be rendered (in home menu) 1`] = `
</div>"
`;
exports[`clicks on client action with invalid key => empty widget is rendered + warning 1`] = `
"<div class=\\"o_web_client\\">
<div class=\\"o_navbar\\">
<a aria-label=\\"Applications\\" class=\\"o_title fa fa-th\\" href=\\"#\\" title=\\"Applications\\" accesskey=\\"h\\"></a>
<a class=\\"o_menu_brand\\" href=\\"\\" role=\\"button\\">
Discuss
</a>
<ul class=\\"o_menu_sections\\">
</ul>
</div>
<div class=\\"o_content\\"><div></div></div>
<div class=\\"o_notification_container\\">
<div class=\\"o_notification o_error\\">
<div class=\\"o_notification_title\\">
<span class=\\"o_icon fa fa-3x fa-exclamation\\" role=\\"img\\" aria-label=\\"Notification Invalid Client Action\\" title=\\"Notification Invalid Client Action\\"></span>
Invalid Client Action
</div>
<div class=\\"o_notification_content\\">
Cannot find widget 'mail.discuss' in the action registry
</div>
</div>
</div>
<div class=\\"o_loading d-none\\">Loading</div>
</div>"
`;
exports[`if url has action_id, will render action and navigate to proper menu_id 1`] = `
"<div class=\\"o_web_client\\">
<div class=\\"o_navbar\\">
+15
View File
@@ -1,6 +1,7 @@
import { Root } from "../../src/ts/ui/root";
import * as helpers from "../helpers";
import { makeTestData, makeTestEnv } from "../helpers";
import { Registry } from "../../src/ts/core/registry";
//------------------------------------------------------------------------------
// Setup and helpers
@@ -61,3 +62,17 @@ test("start with no action => clicks on client action => discuss is rendered", a
menu_id: "96"
});
});
test("clicks on client action with invalid key => empty widget is rendered + warning", async () => {
const data = await makeTestData();
data.actionRegistry = new Registry();
const testEnv = makeTestEnv(data);
const root = new Root(testEnv, testEnv.store);
await root.mount(fixture);
// discuss menu item
await (<any>document.querySelector('[data-menu="96"]')).click();
await helpers.nextTick();
expect(fixture.innerHTML).toMatchSnapshot();
});