diff --git a/addons/web/static/src/search/action_menus/action_menus.js b/addons/web/static/src/search/action_menus/action_menus.js
index f12d2b8d74e..fdecb049424 100644
--- a/addons/web/static/src/search/action_menus/action_menus.js
+++ b/addons/web/static/src/search/action_menus/action_menus.js
@@ -98,7 +98,7 @@ export class ActionMenus extends Component {
const context = makeContext([this.props.context, activeIdsContext]);
return this.actionService.doAction(action.id, {
additionalContext: context,
- on_close: () => this.trigger("reload"),
+ onClose: this.props.onActionExecuted,
});
}
@@ -141,5 +141,9 @@ ActionMenus.props = {
other: { type: Array, optional: true },
},
},
+ onActionExecuted: { type: Function, optional: true },
+};
+ActionMenus.defaultProps = {
+ onActionExecuted: () => {},
};
ActionMenus.template = "web.ActionMenus";
diff --git a/addons/web/static/src/views/form/form_controller.xml b/addons/web/static/src/views/form/form_controller.xml
index 3a851240b97..3a06d5a52a0 100644
--- a/addons/web/static/src/views/form/form_controller.xml
+++ b/addons/web/static/src/views/form/form_controller.xml
@@ -21,6 +21,7 @@
isDomainSelected="model.root.isDomainSelected"
resModel="model.root.resModel"
domain="props.domain"
+ onActionExecuted="() => model.load()"
/>
diff --git a/addons/web/static/src/views/list/list_controller.xml b/addons/web/static/src/views/list/list_controller.xml
index d4e123dbad9..9c74d574e44 100644
--- a/addons/web/static/src/views/list/list_controller.xml
+++ b/addons/web/static/src/views/list/list_controller.xml
@@ -22,7 +22,8 @@
domain="props.domain"
items="getActionMenuItems()"
isDomainSelected="model.root.isDomainSelected"
- resModel="model.root.resModel"/>
+ resModel="model.root.resModel"
+ onActionExecuted="() => model.load()"/>
diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js
index cea77934b6f..68bca4ede21 100644
--- a/addons/web/static/tests/views/form/form_view_tests.js
+++ b/addons/web/static/tests/views/form/form_view_tests.js
@@ -7460,6 +7460,53 @@ QUnit.module("Views", (hooks) => {
await toggleMenuItem(target, "Action partner");
});
+ QUnit.test("execute ActionMenus actions", async function (assert) {
+ const actionService = {
+ start() {
+ return {
+ doAction(id, { additionalContext, onClose }) {
+ assert.step(JSON.stringify({ action_id: id, context: additionalContext }));
+ onClose(); // simulate closing of target new action's dialog
+ },
+ };
+ },
+ };
+ registry.category("services").add("action", actionService, { force: true });
+
+ await makeView({
+ type: "form",
+ resModel: "partner",
+ serverData,
+ resId: 1,
+ arch: `
`,
+ info: {
+ actionMenus: {
+ action: [
+ {
+ id: 29,
+ name: "Action partner",
+ },
+ ],
+ },
+ },
+ mockRPC(route, args) {
+ assert.step(args.method);
+ },
+ });
+
+ assert.containsOnce(target, ".o_cp_action_menus .dropdown-toggle:contains(Action)");
+
+ await toggleActionMenu(target);
+ await toggleMenuItem(target, "Action Partner");
+
+ assert.verifySteps([
+ "get_views",
+ "read",
+ `{"action_id":29,"context":{"lang":"en","uid":7,"tz":"taht","active_id":1,"active_ids":[1],"active_model":"partner","active_domain":[]}}`,
+ "read",
+ ]);
+ });
+
QUnit.test("control panel is not present in FormViewDialogs", async function (assert) {
serverData.models.partner.records[0].product_id = 37;
serverData.views = {
diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js
index adf9ccde91a..fccf8fe2dc8 100644
--- a/addons/web/static/tests/views/list_view_tests.js
+++ b/addons/web/static/tests/views/list_view_tests.js
@@ -7114,6 +7114,60 @@ QUnit.module("Views", (hooks) => {
);
});
+ QUnit.test("execute ActionMenus actions", async function (assert) {
+ patchWithCleanup(actionService, {
+ start() {
+ return {
+ doAction(id, { additionalContext, onClose }) {
+ assert.step(JSON.stringify({ action_id: id, context: additionalContext }));
+ onClose(); // simulate closing of target new action's dialog
+ },
+ };
+ },
+ });
+
+ await makeView({
+ type: "list",
+ resModel: "foo",
+ serverData,
+ arch: '',
+ info: {
+ actionMenus: {
+ action: [
+ {
+ id: 44,
+ name: "Custom Action",
+ type: "ir.actions.act_window",
+ target: "new",
+ },
+ ],
+ print: [],
+ },
+ },
+ actionMenus: {},
+ mockRPC(route, args) {
+ assert.step(args.method);
+ },
+ });
+
+ assert.containsNone(target, "div.o_control_panel .o_cp_action_menus");
+ assert.containsN(target, ".o_data_row", 4);
+ // select all records
+ await click(target, "thead .o_list_record_selector input");
+ assert.containsN(target, ".o_list_record_selector input:checked", 5);
+ assert.containsOnce(target, "div.o_control_panel .o_cp_action_menus");
+
+ await toggleActionMenu(target);
+ await toggleMenuItem(target, "Custom Action");
+
+ assert.verifySteps([
+ "get_views",
+ "web_search_read",
+ `{"action_id":44,"context":{"lang":"en","uid":7,"tz":"taht","active_id":1,"active_ids":[1,2,3,4],"active_model":"foo","active_domain":[]}}`,
+ "web_search_read",
+ ]);
+ });
+
QUnit.test(
"execute ActionMenus actions with correct params (single page)",
async function (assert) {