diff --git a/addons/board/static/tests/add_to_dashboard_tests.js b/addons/board/static/tests/add_to_dashboard_tests.js index 95dbcdc4827..d0e77fa3046 100644 --- a/addons/board/static/tests/add_to_dashboard_tests.js +++ b/addons/board/static/tests/add_to_dashboard_tests.js @@ -10,14 +10,13 @@ import { triggerEvent, } from "@web/../tests/helpers/utils"; import { - applyGroup, openAddCustomFilterDialog, removeFacet, switchView, - toggleAddCustomGroup, toggleSearchBarMenu, toggleMenuItem, toggleMenuItemOption, + selectGroup, } from "@web/../tests/search/helpers"; import { createWebClient, doAction } from "@web/../tests/webclient/helpers"; import { browser } from "@web/core/browser/browser"; @@ -140,8 +139,7 @@ QUnit.module("Board", (hooks) => { // Group It await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); - await applyGroup(target); + await selectGroup(target, "foo"); // add this action to dashboard await testUtils.dom.triggerEvent($(".o_add_to_board button.dropdown-toggle"), "mouseenter"); diff --git a/addons/web/static/src/core/select_menu/select_menu.scss b/addons/web/static/src/core/select_menu/select_menu.scss index e88fb227452..edff948688b 100644 --- a/addons/web/static/src/core/select_menu/select_menu.scss +++ b/addons/web/static/src/core/select_menu/select_menu.scss @@ -66,10 +66,8 @@ .dropup .o_select_menu_menu { box-shadow: 0 -7px 10px rgba(8, 8, 8, 0.319); - border-bottom: none; } .dropdown .o_select_menu_menu { box-shadow: 0 7px 10px rgba(8, 8, 8, 0.319); - border-top: none; -} \ No newline at end of file +} diff --git a/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.js b/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.js index 0e328ba4927..1c2244207fa 100644 --- a/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.js +++ b/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.js @@ -1,20 +1,22 @@ /** @odoo-module **/ -import { AccordionItem } from "@web/core/dropdown/accordion_item"; - -import { Component, useState } from "@odoo/owl"; +import { Component } from "@odoo/owl"; export class CustomGroupByItem extends Component { - setup() { - this.state = useState({}); - if (this.props.fields.length) { - this.state.fieldName = this.props.fields[0].name; + get choices() { + return this.props.fields.map((f) => ({ label: f.string, value: f.name })); + } + + onSelected(ev) { + if (ev.target.value) { + this.props.onAddCustomGroup(ev.target.value); + // reset the placeholder + ev.target.value = ""; } } } CustomGroupByItem.template = "web.CustomGroupByItem"; -CustomGroupByItem.components = { AccordionItem }; CustomGroupByItem.props = { fields: Array, onAddCustomGroup: Function, diff --git a/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.scss b/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.scss new file mode 100644 index 00000000000..42419f31b04 --- /dev/null +++ b/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.scss @@ -0,0 +1,4 @@ +.o_add_custom_group_menu { + background-position-x: calc(100% - 0.6em); + border: 0 !important; +} diff --git a/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.xml b/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.xml index 313b7d74374..577c976df2b 100644 --- a/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.xml +++ b/addons/web/static/src/search/custom_group_by_item/custom_group_by_item.xml @@ -1,24 +1,14 @@ - -
- -
-
- -
-
+
diff --git a/addons/web/static/tests/search/custom_group_by_item_tests.js b/addons/web/static/tests/search/custom_group_by_item_tests.js index fd1b70a04f5..bae61915631 100644 --- a/addons/web/static/tests/search/custom_group_by_item_tests.js +++ b/addons/web/static/tests/search/custom_group_by_item_tests.js @@ -1,15 +1,14 @@ /** @odoo-module **/ import { browser } from "@web/core/browser/browser"; -import { getFixture, patchWithCleanup } from "../helpers/utils"; +import { getFixture, getNodesTextContent, patchWithCleanup } from "../helpers/utils"; import { - applyGroup, getFacetTexts, isItemSelected, isOptionSelected, makeWithSearch, + selectGroup, setupControlPanelServiceRegistry, - toggleAddCustomGroup, toggleMenuItem, toggleSearchBarMenu, } from "./helpers"; @@ -47,7 +46,7 @@ QUnit.module("Search", (hooks) => { QUnit.module("CustomGroupByItem"); QUnit.test("simple rendering", async function (assert) { - assert.expect(5); + assert.expect(2); await makeWithSearch({ serverData, @@ -61,23 +60,13 @@ QUnit.module("Search", (hooks) => { const groupByMenu = target.querySelector(".o_group_by_menu"); assert.strictEqual( - groupByMenu.querySelector(".o_accordion").innerText.trim(), + groupByMenu.querySelector(".o_group_by_menu option[disabled]").innerText.trim(), "Add Custom Group" ); - - assert.containsOnce(groupByMenu, "button"); - assert.containsNone(groupByMenu, ".o_accordion_values"); - - await toggleAddCustomGroup(target); - - assert.containsOnce(groupByMenu, ".o_accordion_values"); - assert.deepEqual( - [ - ...target.querySelectorAll( - ".o_add_custom_group_menu + .o_accordion_values select option" - ), - ].map((el) => el.innerText), + getNodesTextContent( + target.querySelectorAll(".o_add_custom_group_menu option:not([disabled])") + ), ["Birthday", "Date", "Foo"] ); }); @@ -100,16 +89,10 @@ QUnit.module("Search", (hooks) => { }); await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); - - assert.deepEqual( - [ - ...target.querySelectorAll( - ".o_add_custom_group_menu + .o_accordion_values select option" - ), - ].map((el) => el.innerText), - ["Foo"] - ); + const optionDescriptions = [ + ...target.querySelectorAll(".o_add_custom_group_menu option:not([disabled])"), + ].map((option) => option.innerText.trim()); + assert.deepEqual(optionDescriptions, ["Foo"]); } ); @@ -136,16 +119,10 @@ QUnit.module("Search", (hooks) => { }); await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); - - assert.deepEqual( - [ - ...target.querySelectorAll( - ".o_add_custom_group_menu + .o_accordion_values select option" - ), - ].map((el) => el.innerText), - ["Char A", "M2M Stored"] - ); + const optionDescriptions = [ + ...target.querySelectorAll(".o_add_custom_group_menu option:not([disabled])"), + ].map((option) => option.innerText.trim()); + assert.deepEqual(optionDescriptions, ["Char A", "M2M Stored"]); } ); @@ -168,10 +145,9 @@ QUnit.module("Search", (hooks) => { await toggleSearchBarMenu(target); assert.deepEqual(controlPanel.env.searchModel.groupBy, []); - assert.containsOnce(target, ".o_menu_item"); //Add Custom Group + assert.containsOnce(target, ".o_add_custom_group_menu"); //Add Custom Group - await toggleAddCustomGroup(target); - await applyGroup(target); + await selectGroup(target, "date_field"); assert.deepEqual(controlPanel.env.searchModel.groupBy, ["date_field:month"]); assert.deepEqual(getFacetTexts(target), ["Date: Month"]); @@ -184,7 +160,7 @@ QUnit.module("Search", (hooks) => { ); QUnit.test("click on add custom group toggle group selector", async function (assert) { - assert.expect(4); + assert.expect(3); await makeWithSearch({ serverData, @@ -200,27 +176,23 @@ QUnit.module("Search", (hooks) => { const addCustomGroupMenu = target.querySelector(".o_add_custom_group_menu"); - assert.strictEqual(addCustomGroupMenu.innerText.trim(), "Add Custom Group"); - - await toggleAddCustomGroup(target); - - // Single select node with a single option - assert.containsOnce(target, ".o_add_custom_group_menu + .o_accordion_values select"); assert.strictEqual( - target - .querySelector(".o_add_custom_group_menu + .o_accordion_values select option") - .innerText.trim(), - "Super Date" + addCustomGroupMenu.querySelector("option[disabled]").innerText.trim(), + "Add Custom Group" ); - // Button apply - assert.containsOnce(target, ".o_add_custom_group_menu + .o_accordion_values .btn"); + // Single select node with a single option + assert.containsOnce(target, ".o_add_custom_group_menu option:not([disabled])"); + assert.deepEqual( + target.querySelector(".o_add_custom_group_menu option:not([disabled])").textContent, + "Super Date" + ); }); QUnit.test( "select a field name in Add Custom Group menu properly trigger the corresponding field", async function (assert) { - assert.expect(4); + assert.expect(3); await makeWithSearch({ serverData, @@ -237,12 +209,10 @@ QUnit.module("Search", (hooks) => { }); await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); - await applyGroup(target); + await selectGroup(target, "candle_light"); assert.containsN(target, ".o_group_by_menu .o_menu_item", 2); - assert.containsOnce(target, ".o_add_custom_group_menu.o_accordion_toggle"); - assert.containsOnce(target, ".o_add_custom_group_menu + .o_accordion_values"); + assert.containsOnce(target, ".o_add_custom_group_menu"); assert.deepEqual(getFacetTexts(target), ["Candlelight"]); } ); diff --git a/addons/web/static/tests/search/helpers.js b/addons/web/static/tests/search/helpers.js index d43438bd1b0..7c4d3b8d4f4 100644 --- a/addons/web/static/tests/search/helpers.js +++ b/addons/web/static/tests/search/helpers.js @@ -280,25 +280,14 @@ export async function toggleGroupByMenu(el) { await click(findItem(el, `.o_group_by_menu .dropdown-toggle`)); } -export async function toggleAddCustomGroup(el) { - await click(findItem(el, `.o_add_custom_group_menu`)); -} - export async function selectGroup(el, fieldName) { - const select = findItem(el, `.o_add_custom_group_menu + .o_accordion_values select`); - select.value = fieldName; - await triggerEvent(select, null, "change"); -} - -export async function applyGroup(el) { - await click(findItem(el, `.o_add_custom_group_menu + .o_accordion_values .btn`)); + el.querySelector(".o_add_custom_group_menu").value = fieldName; + await triggerEvent(el, ".o_add_custom_group_menu", "change"); } export async function groupByMenu(el, fieldName) { await toggleSearchBarMenu(el); - await toggleAddCustomGroup(el); await selectGroup(el, fieldName); - await applyGroup(el); } /** Favorite menu */ diff --git a/addons/web/static/tests/views/pivot_view_tests.js b/addons/web/static/tests/views/pivot_view_tests.js index e744a3fe4c9..e7d628325f0 100644 --- a/addons/web/static/tests/views/pivot_view_tests.js +++ b/addons/web/static/tests/views/pivot_view_tests.js @@ -11,12 +11,11 @@ import { nextTick, patchDate, patchWithCleanup, - triggerEvent, triggerEvents, mouseEnter, + getNodesTextContent, } from "../helpers/utils"; import { - applyGroup, editFavoriteName, getFacetTexts, removeFacet, @@ -24,7 +23,6 @@ import { selectGroup, setupControlPanelFavoriteMenuRegistry, setupControlPanelServiceRegistry, - toggleAddCustomGroup, toggleSearchBarMenu, toggleMenu, toggleMenuItem, @@ -1010,7 +1008,7 @@ QUnit.module("Views", (hooks) => { assert.containsOnce(target, ".o_pivot .dropdown-menu"); assert.strictEqual( target.querySelector(".o_pivot .dropdown-menu").innerText.replace(/\s/g, ""), - "CompanyTypeCustomerDateOtherProductProductbarAddCustomGroup" + "CompanyTypeCustomerDateOtherProductProductbarAddCustomGroupCompanyTypeCustomerDateOtherProductProductbar" ); // open the Date sub dropdown @@ -1160,8 +1158,8 @@ QUnit.module("Views", (hooks) => { assert.containsN( target, ".dropdown-menu > .dropdown-item", - 3, - "should have 3 dropdown items same as searchview groupby" + 4, + "should have 4 dropdown items same as searchview groupby" ); assert.containsOnce( target, @@ -1169,15 +1167,14 @@ QUnit.module("Views", (hooks) => { "should have custom group generator same as searchview groupby" ); // check custom groupby selection has groupable fields only - await click(target, ".o_add_custom_group_menu"); assert.containsN( target, - ".o_add_custom_group_menu + .o_accordion_values option", + ".o_add_custom_group_menu option:not([disabled])", 6, "should have 6 fields in custom groupby" ); const optionDescriptions = [ - ...target.querySelectorAll(".o_add_custom_group_menu + .o_accordion_values option"), + ...target.querySelectorAll(".o_add_custom_group_menu option:not([disabled])"), ].map((option) => option.innerText.trim()); assert.deepEqual( optionDescriptions, @@ -1219,13 +1216,12 @@ QUnit.module("Views", (hooks) => { target, ".dropdown-menu .o_menu_item", 3, - "should have 2 menu items in pivot groupby" + "should have 3 menu items in pivot groupby" ); // add a custom group in searchview groupby await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); - await applyGroup(target); + await selectGroup(target, "company_type"); assert.containsN( target, ".o_control_panel .o_cp_searchview .dropdown-menu .o_menu_item", @@ -1237,19 +1233,11 @@ QUnit.module("Views", (hooks) => { target, ".dropdown-menu .o_menu_item", 3, - "should still have 2 menu items in pivot groupby" + "should still have 3 menu items in pivot groupby" ); // add a custom group in pivot groupby - await click(target, ".o_add_custom_group_menu"); - target.querySelector(".o_add_custom_group_menu + .o_accordion_values select").value = - "date"; - await triggerEvent( - target, - ".o_add_custom_group_menu + .o_accordion_values select", - "change" - ); - await click(target, ".o_add_custom_group_menu + .o_accordion_values .btn"); + await selectGroup(target, "date"); // click on closed header to open groupby selection dropdown await click(target, "tbody tr:last-child .o_pivot_header_cell_closed"); assert.containsN( @@ -1296,8 +1284,7 @@ QUnit.module("Views", (hooks) => { 5, "should have 5 menu items in searchview" ); - await toggleAddCustomGroup(target); - await applyGroup(target); + await selectGroup(target, "company_type"); assert.containsN( target, ".o_control_panel .o_cp_searchview .dropdown-menu .o_menu_item", @@ -1307,11 +1294,8 @@ QUnit.module("Views", (hooks) => { // click on closed header to open dropdown await click(target.querySelectorAll("tbody .o_pivot_header_cell_closed")[1]); - let items = target.querySelectorAll(".o_menu_item:not(.o_accordion_toggle)"); - assert.deepEqual( - [...items].map((it) => it.innerText), - ["bar", "product"] - ); + let items = target.querySelectorAll(".o_menu_item:not(select)"); + assert.deepEqual(getNodesTextContent(items), ["bar", "product"]); assert.containsOnce( target, "tbody .dropdown-menu .dropdown-divider", @@ -1324,22 +1308,10 @@ QUnit.module("Views", (hooks) => { ); // add a custom group in pivot groupby - await click(target, ".o_add_custom_group_menu"); - target.querySelector(".o_add_custom_group_menu + .o_accordion_values select").value = - "customer"; - await triggerEvent( - target, - ".o_add_custom_group_menu + .o_accordion_values select", - "change" - ); - await click(target, ".o_add_custom_group_menu + .o_accordion_values .btn"); - + await selectGroup(target, "customer"); await click(target.querySelectorAll("tbody .o_pivot_header_cell_closed")[1]); - items = target.querySelectorAll(".o_menu_item:not(.o_accordion_toggle)"); - assert.deepEqual( - [...items].map((it) => it.innerText), - ["bar", "product", "Customer"] - ); + items = target.querySelectorAll(".o_menu_item:not(select)"); + assert.deepEqual(getNodesTextContent(items), ["bar", "product", "Customer"]); assert.containsN( target, "tbody .dropdown-menu .dropdown-divider", @@ -1392,17 +1364,9 @@ QUnit.module("Views", (hooks) => { // click on closed header to open dropdown and apply groupby on date field await click(target.querySelector("thead .o_pivot_header_cell_closed")); - await click(target.querySelector("thead .dropdown-menu .o_add_custom_group_menu ")); checkReadGroup = true; - const select = target.querySelector( - ".o_add_custom_group_menu + .o_accordion_values select" - ); - select.value = "date"; - select.dispatchEvent(new Event("change")); - await click( - target.querySelector(".o_add_custom_group_menu + .o_accordion_values .btn-primary") - ); + await selectGroup(target, "date"); } ); @@ -1518,42 +1482,6 @@ QUnit.module("Views", (hooks) => { } ); - QUnit.test( - "pivot custom groupby: adding a custom group close the pivot groupby menu", - async function (assert) { - assert.expect(3); - - await makeView({ - type: "pivot", - resModel: "partner", - serverData, - arch: ` - - - - `, - searchViewArch: ` - - - `, - }); - - // click on closed header to open dropdown - await click(target.querySelector("thead .o_pivot_header_cell_closed")); - assert.containsOnce(target, "thead .dropdown-menu .o_add_custom_group_menu"); - await click(target.querySelector("thead .dropdown-menu .o_add_custom_group_menu")); - assert.containsOnce(target, "thead .dropdown-menu .o_add_custom_group_menu"); - - // click on apply button should close dropdown - await click( - target.querySelector( - "thead .dropdown-menu .o_add_custom_group_menu + .o_accordion_values .btn-primary" - ) - ); - assert.containsNone(target, "thead .dropdown-menu"); - } - ); - QUnit.test("can toggle extra measure", async function (assert) { let rpcCount = 0; await makeView({ @@ -4477,8 +4405,7 @@ QUnit.module("Views", (hooks) => { // open group by menu and add new groupby await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); - await applyGroup(target); + await selectGroup(target, "company_type"); assert.deepEqual( [...target.querySelectorAll("thead th")].map((th) => th.innerText), @@ -4508,9 +4435,7 @@ QUnit.module("Views", (hooks) => { // open groupby menu generator and add a new groupby await toggleSearchBarMenu(target); - await toggleAddCustomGroup(target); await selectGroup(target, "bar"); - await applyGroup(target); assert.deepEqual( [...target.querySelectorAll("thead th")].map((th) => th.innerText), @@ -5449,7 +5374,7 @@ QUnit.module("Views", (hooks) => { "The row headers should be as expected" ); - await toggleMenuItem(target, "Customer"); + await toggleMenuItem(target, "customer"); assert.deepEqual( [...target.querySelectorAll("th")].slice(3).map((el) => el.innerText), diff --git a/addons/website/static/tests/tours/page_manager.js b/addons/website/static/tests/tours/page_manager.js index 12e557c89fd..7134c071fa4 100644 --- a/addons/website/static/tests/tours/page_manager.js +++ b/addons/website/static/tests/tours/page_manager.js @@ -11,11 +11,9 @@ const checkKanbanGroupBy = [{ extra_trigger: '.o_kanban_renderer', trigger: '.o_control_panel .o_searchview_dropdown_toggler', }, { - content: "Click on Add Custom Group", - trigger: '.o_add_custom_group_menu', -}, { - content: "Click on Apply", // Active is selected by default - trigger: '.o_add_custom_group_menu + .o_accordion_values .btn-primary', + content: "Select 'Active' in the select of Add Custom Group", + trigger: ".o_add_custom_group_menu", + run: "text active", }, { content: "Click on List View", extra_trigger: '.o_kanban_renderer .o_kanban_header',