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": ``, + "partner,1,form": `
`, + }); + + const webClient = await createWebClient({ serverData, mockRPC }); + await click(webClient.el.querySelector(".o_debug_manager button")); + await click(webClient.el.querySelector(".o_debug_manager .o_dropdown_item")); + await legacyExtraNextTick(); + assert.containsOnce(webClient, ".modal .o_list_view"); + + await click(webClient.el.querySelector(".modal .o_list_view .o_data_row")); + await legacyExtraNextTick(); + assert.containsNone(webClient, ".modal"); + assert.containsOnce(webClient, ".some_view"); + }); });