diff --git a/addons/web/static/src/core/debug/debug_menu_items.xml b/addons/web/static/src/core/debug/debug_menu_items.xml index d3c447b4714..b6bbb5fd385 100644 --- a/addons/web/static/src/core/debug/debug_menu_items.xml +++ b/addons/web/static/src/core/debug/debug_menu_items.xml @@ -14,8 +14,7 @@ @@ -31,8 +30,7 @@ diff --git a/addons/web/static/src/legacy/debug_manager.js b/addons/web/static/src/legacy/debug_manager.js index c0b4a89b894..ec823a43bc6 100644 --- a/addons/web/static/src/legacy/debug_manager.js +++ b/addons/web/static/src/legacy/debug_manager.js @@ -216,7 +216,7 @@ SetDefaultDialog.title = _lt("Set Default"); // Form view items -function setDefaults({ action, component, env }) { +export function setDefaults({ action, component, env }) { return { type: "item", description: env._t("Set Defaults"), 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 e37d49f4435..da9b649d94e 100644 --- a/addons/web/static/tests/core/debug/debug_manager_tests.js +++ b/addons/web/static/tests/core/debug/debug_manager_tests.js @@ -22,11 +22,13 @@ import { getFixture, legacyExtraNextTick, mount, + nextTick, patchWithCleanup, } from "../../helpers/utils"; import { createWebClient, doAction, getActionManagerServerData } from "../../webclient/helpers"; import { openViewItem } from "@web/webclient/debug_items"; import { editSearchView, editView } from "@web/views/debug_items"; +import { setDefaults } from "@web/legacy/debug_manager"; const { Component, xml } = owl; @@ -504,4 +506,158 @@ QUnit.module("DebugMenu", (hooks) => { assert.containsNone(target, ".o_debug_manager .dropdown-item"); } ); + + QUnit.test("set defaults: basic rendering", async (assert) => { + prepareRegistriesWithCleanup(); + patchWithCleanup(odoo, { + debug: true, + }); + + registry.category("services").add("user", makeFakeUserService()); + registry.category("debug").category("form").add("setDefaults", setDefaults); + + const serverData = getActionManagerServerData(); + serverData.actions[1234] = { + id: 1234, + xml_id: "action_1234", + name: "Partners", + res_model: "partner", + res_id: 1, + type: "ir.actions.act_window", + views: [[18, "form"]], + }; + serverData.views["partner,18,form"] = ` +
+ + + + `; + serverData.models["ir.ui.view"] = { + fields: {}, + records: [{ id: 18 }], + }; + serverData.models.partner.fields.m2o.depends = []; + serverData.models.partner.fields.foo.depends = []; + serverData.models.partner.fields.o2m.depends = []; + serverData.models.partner.records = [{ id: 1, display_name: "p1", foo: "hello" }]; + + const mockRPC = async (route, args) => { + if (args.method === "check_access_rights") { + return Promise.resolve(true); + } + }; + const webClient = await createWebClient({ serverData, mockRPC }); + await doAction(webClient, 1234); + await click(target.querySelector(".o_debug_manager button")); + await click(target.querySelector(".o_debug_manager .dropdown-item")); + assert.containsOnce(target, ".modal"); + assert.containsOnce(target, ".modal select#formview_default_fields"); + assert.containsN(target.querySelector(".modal #formview_default_fields"), "option", 2); + const options = target.querySelectorAll(".modal #formview_default_fields option"); + assert.strictEqual(options[0].value, ""); + assert.strictEqual(options[1].value, "foo"); + }); + + QUnit.test("set defaults: click close", async (assert) => { + prepareRegistriesWithCleanup(); + patchWithCleanup(odoo, { + debug: true, + }); + + registry.category("services").add("user", makeFakeUserService()); + registry.category("debug").category("form").add("setDefaults", setDefaults); + + const serverData = getActionManagerServerData(); + serverData.actions[1234] = { + id: 1234, + xml_id: "action_1234", + name: "Partners", + res_model: "partner", + res_id: 1, + type: "ir.actions.act_window", + views: [[18, "form"]], + }; + serverData.views["partner,18,form"] = ` +
+ + `; + serverData.models["ir.ui.view"] = { + fields: {}, + records: [{ id: 18 }], + }; + serverData.models.partner.fields.foo.depends = []; + serverData.models.partner.records = [{ id: 1, display_name: "p1", foo: "hello" }]; + + const mockRPC = async (route, args) => { + if (args.method === "set" && args.model === "ir.default") { + throw new Error("should not create a default"); + } + if (args.method === "check_access_rights") { + return Promise.resolve(true); + } + }; + const webClient = await createWebClient({ serverData, mockRPC }); + await doAction(webClient, 1234); + await click(target.querySelector(".o_debug_manager button")); + await click(target.querySelector(".o_debug_manager .dropdown-item")); + assert.containsOnce(target, ".modal"); + + await click(target.querySelector(".modal .modal-footer button")); + assert.containsNone(target, ".modal"); + }); + + QUnit.test("set defaults: select and save", async (assert) => { + assert.expect(3); + + prepareRegistriesWithCleanup(); + patchWithCleanup(odoo, { + debug: true, + }); + + registry.category("services").add("user", makeFakeUserService()); + registry.category("debug").category("form").add("setDefaults", setDefaults); + + const serverData = getActionManagerServerData(); + serverData.actions[1234] = { + id: 1234, + xml_id: "action_1234", + name: "Partners", + res_model: "partner", + res_id: 1, + type: "ir.actions.act_window", + views: [[18, "form"]], + }; + serverData.views["partner,18,form"] = ` +
+ + `; + serverData.models["ir.ui.view"] = { + fields: {}, + records: [{ id: 18 }], + }; + serverData.models.partner.fields.foo.depends = []; + serverData.models.partner.records = [{ id: 1, display_name: "p1", foo: "hello" }]; + + const mockRPC = async (route, args) => { + if (args.method === "check_access_rights") { + return Promise.resolve(true); + } + if (args.method === "set" && args.model === "ir.default") { + assert.deepEqual(args.args, ["partner", "foo", "hello", true, true, false]); + return true; + } + }; + const webClient = await createWebClient({ serverData, mockRPC }); + await doAction(webClient, 1234); + await click(target.querySelector(".o_debug_manager button")); + await click(target.querySelector(".o_debug_manager .dropdown-item")); + assert.containsOnce(target, ".modal"); + + const select = target.querySelector(".modal #formview_default_fields"); + select.value = "foo"; + select.dispatchEvent(new Event("change")); + await nextTick(); + await click(target.querySelectorAll(".modal .modal-footer button")[1]); + assert.containsNone(target, ".modal"); + }); });