diff --git a/addons/web/static/src/core/debug/debug_menu_items.js b/addons/web/static/src/core/debug/debug_menu_items.js
index eced7c1d768..b80891ece32 100644
--- a/addons/web/static/src/core/debug/debug_menu_items.js
+++ b/addons/web/static/src/core/debug/debug_menu_items.js
@@ -4,6 +4,10 @@ import { browser } from "../browser/browser";
import { routeToUrl } from "../browser/router_service";
import { registry } from "../registry";
+// @legacy
+import dialogs from "web.view_dialogs";
+import { ComponentAdapter } from "web.OwlCompatibility";
+
// Backend Debug Manager Items
function runJSTestsItem({ env }) {
const runTestsURL = browser.location.origin + "/web/tests?mod=*";
@@ -31,15 +35,41 @@ function runJSTestsMobileItem({ env }) {
};
}
-function openViewItem({ env }) {
+export function openViewItem({ env }) {
+ async function onSelected(records) {
+ const views = await env.services.orm.searchRead(
+ "ir.ui.view",
+ [["id", "=", records[0].id]],
+ ["name", "model", "type"],
+ { limit: 1 }
+ );
+ const view = views[0];
+ view.type = view.type === "tree" ? "list" : view.type; // ignore tree view
+ env.services.action.doAction({
+ type: "ir.actions.act_window",
+ name: view.name,
+ res_model: view.model,
+ views: [[view.id, view.type]],
+ });
+ }
+
return {
type: "item",
description: env._t("Open View"),
callback: () => {
- console.log("Open View");
- // select_view
- // disable_multiple_selection don't work
- // Need to add SelectCreateDialog and SelectCreateListController
+ const adapterParent = new ComponentAdapter(null, { Component: owl.Component });
+ const selectCreateDialog = new dialogs.SelectCreateDialog(adapterParent, {
+ res_model: "ir.ui.view",
+ title: env._t("Select a view"),
+ disable_multiple_selection: true,
+ domain: [
+ ["type", "!=", "qweb"],
+ ["type", "!=", "search"],
+ ],
+ on_selected: onSelected,
+ });
+
+ selectCreateDialog.open();
},
sequence: 40,
};
diff --git a/addons/web/static/tests/core/debug/debug_manager_tests.js b/addons/web/static/tests/core/debug/debug_manager_tests.js
index f3558317661..9252bb3982c 100644
--- a/addons/web/static/tests/core/debug/debug_manager_tests.js
+++ b/addons/web/static/tests/core/debug/debug_manager_tests.js
@@ -10,9 +10,11 @@ import { uiService } from "@web/core/ui_service";
import { ActionDialog } from "@web/webclient/actions/action_dialog";
import { hotkeyService } from "@web/webclient/hotkeys/hotkey_service";
import { registerCleanup } from "../../helpers/cleanup";
-import { makeTestEnv } from "../../helpers/mock_env";
+import { makeTestEnv, prepareRegistriesWithCleanup } from "../../helpers/mock_env";
import { makeFakeLocalizationService } from "../../helpers/mock_services";
-import { click, getFixture, patchWithCleanup } from "../../helpers/utils";
+import { click, getFixture, legacyExtraNextTick, patchWithCleanup } from "../../helpers/utils";
+import { createWebClient, getActionManagerServerData } from "../../webclient/helpers";
+import { openViewItem } from "@web/core/debug/debug_menu_items";
const { Component, hooks, mount, tags } = owl;
const { useSubEnv } = hooks;
@@ -242,4 +244,58 @@ QUnit.module("DebugMenu", (hooks) => {
await click(item);
assert.verifySteps(["ir.attachment/search", "ir.attachment/unlink", "reloadPage"]);
});
+
+ QUnit.test("can open a view", async (assert) => {
+ assert.expect(3);
+
+ const mockRPC = async (route, args) => {
+ if (args.method === "check_access_rights") {
+ return Promise.resolve(true);
+ }
+ };
+ prepareRegistriesWithCleanup();
+
+ patchWithCleanup(odoo, {
+ debug: true,
+ });
+
+ registry.category("debug").add("openViewItem", openViewItem);
+ registry.category("services").add("debug", debugService);
+
+ const serverData = getActionManagerServerData();
+ Object.assign(serverData.models, {
+ "ir.ui.view": {
+ fields: {
+ model: { type: "char" },
+ name: { type: "char" },
+ type: { type: "char" },
+ },
+ records: [
+ {
+ id: 1,
+ name: "formView",
+ model: "partner",
+ type: "form",
+ },
+ ],
+ },
+ });
+
+ Object.assign(serverData.views, {
+ "ir.ui.view,false,list": `
`,
+ "ir.ui.view,false,search": `