From 180de8afe6d6db548dc724377e468a3c27ed0462 Mon Sep 17 00:00:00 2001 From: Damien Bouvy Date: Tue, 29 Aug 2023 10:29:33 +0200 Subject: [PATCH] [IMP] web, *: replace view all with search more This partially reverts commit da50ce31ae825ef9f4b527553a2e2caec970d290. Whilst the behavioral changes done in the task are correct, the wording is not optimal and was better understood by users before this change. Task-3483936 closes odoo/odoo#133511 Related: odoo/enterprise#46503 Signed-off-by: Florent Dardenne (dafl) --- .../analytic_distribution.js | 14 +-- .../tests/analytic_distribution_tests.js | 4 +- .../static/tests/import_records_tests.js | 2 +- .../lunch/static/tests/lunch_kanban_tests.js | 6 +- .../mass_mailing_favourite_filter_tests.js | 9 +- .../static/src/js/sale_order_many2one.js | 2 +- .../static/tests/sale_order_many2one_tests.js | 2 +- .../filter_panel/calendar_filter_panel.js | 6 +- .../many2many_tags/many2many_tags_field.js | 2 +- .../many2many_tags/many2many_tags_field.xml | 2 +- .../views/fields/properties/property_value.js | 2 +- .../src/views/fields/relational_utils.js | 22 ++--- .../src/views/fields/relational_utils.xml | 2 +- .../static/tests/search/search_panel_tests.js | 35 ++++--- .../views/calendar/calendar_view_tests.js | 15 ++- .../views/fields/many2many_field_tests.js | 2 +- .../many2many_tags_avatar_field_tests.js | 2 +- .../fields/many2many_tags_field_tests.js | 34 +++---- .../fields/many2one_avatar_field_tests.js | 4 +- .../views/fields/many2one_field_tests.js | 48 +++++----- .../views/fields/properties_field_tests.js | 4 +- .../web/static/tests/views/list_view_tests.js | 96 +++++++++---------- 22 files changed, 154 insertions(+), 161 deletions(-) diff --git a/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js b/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js index 22a6077137b..95638dc094f 100644 --- a/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js +++ b/addons/analytic/static/src/components/analytic_distribution/analytic_distribution.js @@ -77,7 +77,7 @@ export class AnalyticDistribution extends Component { this.selectCreateIsOpen = false; this.addDialog = useOwnedDialogs(); - this.onViewAll = this._onViewAll.bind(this); + this.onSearchMore = this._onSearchMore.bind(this); } // Lifecycle @@ -247,15 +247,15 @@ export class AnalyticDistribution extends Component { color: result.color, })); - if (records.length) { + if (searchLimit < records.length) { options.push({ - label: _t("View all"), - action: (editedTag) => this.onViewAll(searchTerm, editedTag), - classList: "o_m2o_dropdown_option o_m2o_dropdown_option_view_all", + label: _t("Search More..."), + action: (editedTag) => this.onSearchMore(searchTerm, editedTag), + classList: "o_m2o_dropdown_option o_m2o_dropdown_option_search_more", }); } - else { + if (!options.length) { options.push({ label: _t("No Analytic Accounts for this plan"), classList: "o_m2o_no_result", @@ -266,7 +266,7 @@ export class AnalyticDistribution extends Component { return options; } - async _onViewAll(searchTerm, editedTag) { + async _onSearchMore(searchTerm, editedTag) { let dynamicFilters = []; if (searchTerm.length) { dynamicFilters = [ diff --git a/addons/analytic/static/tests/analytic_distribution_tests.js b/addons/analytic/static/tests/analytic_distribution_tests.js index 39c4e2d1b8f..6a91a4faccb 100644 --- a/addons/analytic/static/tests/analytic_distribution_tests.js +++ b/addons/analytic/static/tests/analytic_distribution_tests.js @@ -250,7 +250,7 @@ QUnit.module("Analytic", (hooks) => { let incompleteCountryTag = popup.querySelector("table#plan_5 .incomplete .o_analytic_account_name input"); await click(incompleteCountryTag); - await click(target.querySelector(".o_m2o_dropdown_option_view_all")); + await click(target.querySelector(".o_m2o_dropdown_option_search_more")); assert.containsN(target, ".modal-dialog .o_list_renderer", 1, "select create list dialog is visible"); @@ -282,7 +282,7 @@ QUnit.module("Analytic", (hooks) => { // replace the first analytic account with 4 accounts triggerHotkey("shift+Tab"); await click(document.activeElement); - await click(target.querySelector(".o_m2o_dropdown_option_view_all")); + await click(target.querySelector(".o_m2o_dropdown_option_search_more")); accountRows = [...target.querySelectorAll(".modal-dialog .o_data_row")]; for (const row of accountRows.slice(0,4)) { await click(row.querySelector(".o_list_record_selector input")); diff --git a/addons/base_import/static/tests/import_records_tests.js b/addons/base_import/static/tests/import_records_tests.js index a57dc126adc..b0ce7cc9225 100644 --- a/addons/base_import/static/tests/import_records_tests.js +++ b/addons/base_import/static/tests/import_records_tests.js @@ -235,7 +235,7 @@ QUnit.module("Base Import Tests", (hooks) => { }, }); - await selectDropdownItem(target, "m2o", "View all"); + await selectDropdownItem(target, "m2o", "Search More..."); const dialog = target.querySelector(".modal"); assert.containsNone(dialog, ".o_cp_action_menus"); assert.containsNone(dialog, ".o_import_menu"); diff --git a/addons/lunch/static/tests/lunch_kanban_tests.js b/addons/lunch/static/tests/lunch_kanban_tests.js index d4ab67e3ea7..182052e1804 100644 --- a/addons/lunch/static/tests/lunch_kanban_tests.js +++ b/addons/lunch/static/tests/lunch_kanban_tests.js @@ -203,7 +203,7 @@ QUnit.module('LunchKanban', (hooks) => { await nextTick(); assert.containsOnce(target, '.lunch_location .dropdown-item:contains(New Office)'); - click(target, '.lunch_location .ui-menu-item:nth-child(2) .dropdown-item'); + click(target, '.lunch_location li:not(.o_m2o_dropdown_option) .dropdown-item:not(.ui-state-active)'); await nextTick(); assert.containsN(target, 'div[role=article].o_kanban_record', 2); @@ -245,7 +245,7 @@ QUnit.module('LunchKanban', (hooks) => { assert.containsOnce(target, '.lunch_user .dropdown-item:contains(David Elora)'); expectedUserId = 2; - click(target, '.lunch_user .ui-menu-item:nth-child(2) .dropdown-item'); + click(target, '.lunch_user li:not(.o_m2o_dropdown_option) .dropdown-item:not(.ui-state-active)'); await nextTick(); const wallet = target.querySelector('.o_lunch_banner .col-9 > .d-flex > span:nth-child(2)'); @@ -253,7 +253,7 @@ QUnit.module('LunchKanban', (hooks) => { click(target, '.lunch_location input'); await nextTick(); - click(target, '.lunch_location .ui-menu-item:nth-child(2) .dropdown-item'); + click(target, '.lunch_location li:not(.o_m2o_dropdown_option) .dropdown-item:not(.ui-state-active)'); await nextTick(); const user = target.querySelector('.lunch_user input'); diff --git a/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js b/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js index 0080735e077..7d478898c6e 100644 --- a/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js +++ b/addons/mass_mailing/static/tests/mass_mailing_favourite_filter_tests.js @@ -145,9 +145,8 @@ QUnit.module('favorite filter widget', (hooks) => { assert.isVisible(fixture.querySelector('.o_mass_mailing_save_filter_container'), "should have option to save filter if no filter is set"); await testUtils.click(fixture.querySelector('.o_field_mailing_filter input')); - assert.containsN($dropdown, 'li.ui-menu-item', - 2, - "there should be only one existing filter as well as the View all option"); + assert.containsN($dropdown, 'li.ui-menu-item', 2, + "there should be only one existing filter and a search more btn"); // create a new filter await testUtils.click(fixture, '.o_mass_mailing_add_filter'); fixture.querySelector('.o_mass_mailing_filter_name').value = 'event promo - new users'; @@ -168,7 +167,7 @@ QUnit.module('favorite filter widget', (hooks) => { fixture.querySelector('.o_field_mailing_filter .o_input_dropdown input').blur(); await testUtils.click(fixture.querySelector('.o_field_mailing_filter input')); assert.containsN($dropdown, 'li.ui-menu-item', 3, - "there should be two existing filters (and the View all option)"); + "there should be two existing filters and a search more btn"); await testUtils.clickSave(fixture); }); @@ -290,7 +289,7 @@ QUnit.module('favorite filter widget', (hooks) => { await testUtils.click(fixture.querySelector('.o_field_mailing_filter input')); fixture.querySelector('.o_field_mailing_filter input').autocomplete = 'widget'; const $dropdown = fixture.querySelector('.o_field_mailing_filter .dropdown'); - await testUtils.click($dropdown.lastElementChild.firstElementChild); + await testUtils.click($dropdown.lastElementChild, 'li:first-of-type'); assert.equal(fixture.querySelector('.o_domain_show_selection_button').textContent.trim(), '1 record(s)', "applied filter should only display single record (only Azure)"); await testUtils.clickSave(fixture); diff --git a/addons/sale_expense/static/src/js/sale_order_many2one.js b/addons/sale_expense/static/src/js/sale_order_many2one.js index 4191db8245a..79360a83e6e 100644 --- a/addons/sale_expense/static/src/js/sale_order_many2one.js +++ b/addons/sale_expense/static/src/js/sale_order_many2one.js @@ -16,7 +16,7 @@ export class OrderField extends Many2OneField { // hide the search more option from the dropdown menu return { ...super.Many2XAutocompleteProps, - noViewAll: true, + noSearchMore: true, } } } diff --git a/addons/sale_expense/static/tests/sale_order_many2one_tests.js b/addons/sale_expense/static/tests/sale_order_many2one_tests.js index eaf50be9b56..740fb2ae062 100644 --- a/addons/sale_expense/static/tests/sale_order_many2one_tests.js +++ b/addons/sale_expense/static/tests/sale_order_many2one_tests.js @@ -70,6 +70,6 @@ QUnit.module('sale_expense', { await clickDropdown(this.target, "sale_order_id"); assert.containsN(this.target, 'li.o-autocomplete--dropdown-item', 9); - assert.containsNone(this.target, '.o_m2o_dropdown_option_view_all', "Should not display the 'View all option'"); + assert.containsNone(this.target, '.o_m2o_dropdown_option_search_more', "Should not display the 'Search More... option'"); }); }); diff --git a/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js b/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js index babb8e4cde7..f56197299bd 100644 --- a/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js +++ b/addons/web/static/src/views/calendar/filter_panel/calendar_filter_panel.js @@ -66,8 +66,8 @@ export class CalendarFilterPanel extends Component { if (records.length > 7) { options.push({ - label: _t("View all"), - action: () => this.onViewAll(section, resModel, domain, request), + label: _t("Search More..."), + action: () => this.onSearchMore(section, resModel, domain, request), }); } @@ -82,7 +82,7 @@ export class CalendarFilterPanel extends Component { return options; } - async onViewAll(section, resModel, domain, request) { + async onSearchMore(section, resModel, domain, request) { const dynamicFilters = []; if (request.length) { const nameGets = await this.orm.call(resModel, "name_search", [], { diff --git a/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js b/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js index 81f6a78b4df..84bc05ffb98 100644 --- a/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js +++ b/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.js @@ -44,7 +44,7 @@ export class Many2ManyTagsField extends Component { placeholder: { type: String, optional: true }, nameCreateField: { type: String, optional: true }, string: { type: String, optional: true }, - noViewAll: { type: Boolean, optional: true }, + noSearchMore: { type: Boolean, optional: true }, }; static defaultProps = { canCreate: true, diff --git a/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.xml b/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.xml index 8163cff2ce4..a3964937526 100644 --- a/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.xml +++ b/addons/web/static/src/views/fields/many2many_tags/many2many_tags_field.xml @@ -21,7 +21,7 @@ getDomain.bind="getDomain" isToMany="true" nameCreateField="props.nameCreateField" - noViewAll="props.noViewAll" + noSearchMore="props.noSearchMore" /> diff --git a/addons/web/static/src/views/fields/properties/property_value.js b/addons/web/static/src/views/fields/properties/property_value.js index c3d477a4d23..4f7c3f8e400 100644 --- a/addons/web/static/src/views/fields/properties/property_value.js +++ b/addons/web/static/src/views/fields/properties/property_value.js @@ -227,7 +227,7 @@ export class PropertyValue extends Component { : false; if (newValue && newValue[0] && newValue[1] === undefined) { - // The "View all" option in the Many2XAutocomplete component + // The "Search More" option in the Many2XAutocomplete component // only return the record ID, and not the name. But we need to name // in the component props to be able to display it. // Make a RPC call to resolve the display name of the record. diff --git a/addons/web/static/src/views/fields/relational_utils.js b/addons/web/static/src/views/fields/relational_utils.js index 65be6f302e2..25021920376 100644 --- a/addons/web/static/src/views/fields/relational_utils.js +++ b/addons/web/static/src/views/fields/relational_utils.js @@ -301,11 +301,11 @@ export class Many2XAutocomplete extends Component { }); } - if (!this.props.noViewAll && records.length > 0) { + if (!this.props.noSearchMore && records.length > 0) { options.push({ - label: _t("View all"), - action: this.onViewAll.bind(this, request), - classList: "o_m2o_dropdown_option o_m2o_dropdown_option_view_all", + label: _t("Search More..."), + action: this.onSearchMore.bind(this, request), + classList: "o_m2o_dropdown_option o_m2o_dropdown_option_search_more", }); } @@ -343,10 +343,10 @@ export class Many2XAutocomplete extends Component { async onBarcodeSearch() { const autoCompleteInput = this.autoCompleteContainer.el.querySelector("input"); - return this.onViewAll(autoCompleteInput.value); + return this.onSearchMore(autoCompleteInput.value); } - async onViewAll(request) { + async onSearchMore(request) { const { resModel, getDomain, context, fieldString } = this.props; const domain = getDomain(); @@ -356,7 +356,7 @@ export class Many2XAutocomplete extends Component { name: request, args: domain, operator: "ilike", - limit: this.props.viewAllLimit, + limit: this.props.searchMoreLimit, context, }); @@ -396,8 +396,8 @@ Many2XAutocomplete.props = { getDomain: Function, searchLimit: { type: Number, optional: true }, quickCreate: { type: [Function, { value: null }], optional: true }, - noViewAll: { type: Boolean, optional: true }, - viewAllLimit: { type: Number, optional: true }, + noSearchMore: { type: Boolean, optional: true }, + searchMoreLimit: { type: Number, optional: true }, fieldString: String, id: { type: String, optional: true }, placeholder: { type: String, optional: true }, @@ -409,7 +409,7 @@ Many2XAutocomplete.props = { }; Many2XAutocomplete.defaultProps = { searchLimit: 7, - viewAllLimit: 320, + searchMoreLimit: 320, nameCreateField: "name", value: "", setInputFloats: () => {}, @@ -633,7 +633,7 @@ X2ManyFieldDialog.props = { save: Function, title: String, delete: { optional: true }, - deleteButtonLabel: { optional: true }, + deleteButtonLabel: {optional: true}, config: Object, }; X2ManyFieldDialog.template = "web.X2ManyFieldDialog"; diff --git a/addons/web/static/src/views/fields/relational_utils.xml b/addons/web/static/src/views/fields/relational_utils.xml index f322e87bf1e..643ed852894 100644 --- a/addons/web/static/src/views/fields/relational_utils.xml +++ b/addons/web/static/src/views/fields/relational_utils.xml @@ -43,7 +43,7 @@ readonly="" t-att-placeholder="props.placeholder" t-att-value="props.value" - t-on-click="onViewAll" + t-on-click="onSearchMore" t-on-barcode-search="onBarcodeSearch" /> { await doAction(webclient, 1, { viewType: "form" }); - await selectDropdownItem(target, "company_id", "View all"); + await selectDropdownItem(target, "company_id", "Search More..."); assert.containsOnce(document.body, ".modal .o_list_view"); assert.containsNone(document.body, ".modal .o_search_panel"); @@ -3454,22 +3454,19 @@ QUnit.module("Search", (hooks) => { ); }); - QUnit.test( - "Don't display empty state message when some filters are available", - async (assert) => { - const { TestComponent } = makeTestComponent(); - await makeWithSearch({ - serverData, - Component: TestComponent, - resModel: "partner", - searchViewId: false, - }); + QUnit.test("Don't display empty state message when some filters are availible", async (assert) => { + const { TestComponent } = makeTestComponent(); + await makeWithSearch({ + serverData, + Component: TestComponent, + resModel: "partner", + searchViewId: false, + }); - assert.containsNone( - target, - ".o_search_panel_empty_state", - "Search panel does not have the empty state container" - ); - } - ); + assert.containsNone( + target, + ".o_search_panel_empty_state", + "Search panel does not have the empty state container" + ); + }); }); diff --git a/addons/web/static/tests/views/calendar/calendar_view_tests.js b/addons/web/static/tests/views/calendar/calendar_view_tests.js index a6e4178811a..44c6d643dd8 100644 --- a/addons/web/static/tests/views/calendar/calendar_view_tests.js +++ b/addons/web/static/tests/views/calendar/calendar_view_tests.js @@ -610,7 +610,7 @@ QUnit.module("Views", ({ beforeEach }) => { "foo partner 8", "foo partner 9", "foo partner 10", - "View all", + "Search More...", ] ); @@ -633,7 +633,7 @@ QUnit.module("Views", ({ beforeEach }) => { "foo partner 10", "foo partner 11", "foo partner 12", - "View all", + "Search More...", ] ); @@ -693,7 +693,7 @@ QUnit.module("Views", ({ beforeEach }) => { "foo partner 9", "foo partner 10", "foo partner 11", - "View all", + "Search More...", ] ); @@ -715,7 +715,7 @@ QUnit.module("Views", ({ beforeEach }) => { "foo partner 11", "foo partner 12", "foo partner 13", - "View all", + "Search More...", ] ); @@ -960,7 +960,12 @@ QUnit.module("Views", ({ beforeEach }) => { assert.containsN(target, ".fc-event-container .fc-event", 10, "should display 10 events"); // move to next month await navigate(target, "next"); - assert.containsN(target, ".fc-event-container .fc-event", 0, "should display 0 events"); + assert.containsN( + target, + ".fc-event-container .fc-event", + 0, + "should display 0 events" + ); await pickDate(target, "2017-01-01"); assert.containsN( target, diff --git a/addons/web/static/tests/views/fields/many2many_field_tests.js b/addons/web/static/tests/views/fields/many2many_field_tests.js index f2182d867ac..02ea53bf4a4 100644 --- a/addons/web/static/tests/views/fields/many2many_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_field_tests.js @@ -1983,7 +1983,7 @@ QUnit.module("Fields", (hooks) => { }); await click(target, ".o_field_many2many_selection input"); checkGetViews = true; - await clickOpenedDropdownItem(target, "timmy", "View all"); + await clickOpenedDropdownItem(target, "timmy", "Search More..."); assert.verifySteps([`get_views`]); assert.containsOnce(target, ".modal"); diff --git a/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js b/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js index 7c8fa638a5b..da265a3dea7 100644 --- a/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_tags_avatar_field_tests.js @@ -430,7 +430,7 @@ QUnit.module("Fields", (hooks) => { "Should have 2 tags" ); // load more - await click(popover.querySelector(".o_m2o_dropdown_option_view_all")); + await click(popover.querySelector(".o_m2o_dropdown_option_search_more")); // first item await click(document.querySelector(".o_dialog .o_list_table .o_data_row .o_data_cell")); assert.strictEqual(popover.querySelectorAll(".o_tag").length, 4, "Should have 4 tags"); diff --git a/addons/web/static/tests/views/fields/many2many_tags_field_tests.js b/addons/web/static/tests/views/fields/many2many_tags_field_tests.js index e08d0f0274d..826e22eff30 100644 --- a/addons/web/static/tests/views/fields/many2many_tags_field_tests.js +++ b/addons/web/static/tests/views/fields/many2many_tags_field_tests.js @@ -166,7 +166,7 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual( autocomplete.querySelectorAll("li").length, 4, - "autocomplete dropdown should have 4 entries (2 values + 'View all' + 'Start typing...')" + "autocomplete dropdown should have 4 entries (2 values + 'Search More...' + 'Search and Edit...')" ); await clickOpenedDropdownItem(target, "timmy", "gold"); assert.containsOnce(target, "[name=timmy] .o_tag"); @@ -248,7 +248,7 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual( autocompleteDropdown.querySelectorAll("li").length, 3, - "autocomplete dropdown should have 3 entries" + "autocomplete dropdown should have 3 entry" ); assert.strictEqual( @@ -502,7 +502,7 @@ QUnit.module("Fields", (hooks) => { ); assert.deepEqual( getNodesTextContent(autocompleteDropdown.querySelectorAll("li")), - ["silver", "View all", "Start typing..."], + ["silver", "Search More...", "Start typing..."], "should contain newly added tag 'silver'" ); assert.strictEqual( @@ -548,7 +548,7 @@ QUnit.module("Fields", (hooks) => { autocompleteDropdown, "li", 3, - "autocomplete should contain 'silver', 'View all' and 'Start typing...' options" + "autocomplete should contain 'silver'm 'Search More...' and 'Start typing...' options" ); assert.strictEqual( autocompleteDropdown.querySelector("li a").textContent, @@ -567,7 +567,7 @@ QUnit.module("Fields", (hooks) => { autocompleteDropdown, "li", 3, - "autocomplete should contain 'gold', 'View all' and 'Start typing...' options" + "autocomplete should contain 'gold'm 'Search More...' and 'Start typing...' options" ); assert.strictEqual( autocompleteDropdown.querySelector("li a").textContent, @@ -611,7 +611,7 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual( autocomplete.querySelectorAll("li").length, 4, - "autocomplete dropdown should have 4 entries (2 values + 'View all' + 'Start typing...')" + "autocomplete dropdown should have 4 entries (2 values + 'Search More...' + 'Search and Edit...')" ); await clickOpenedDropdownItem(target, "timmy", "gold"); @@ -1190,7 +1190,7 @@ QUnit.module("Fields", (hooks) => { `, }); - await selectDropdownItem(target, "timmy", "View all"); + await selectDropdownItem(target, "timmy", "Search More..."); assert.ok(target.querySelector(".o_dialog"), "should have open the modal"); // + 1 for the select all @@ -1246,7 +1246,7 @@ QUnit.module("Fields", (hooks) => { `, }); - await selectDropdownItem(target, "timmy", "View all"); + await selectDropdownItem(target, "timmy", "Search More..."); // -1 for the one that is already on the form & +1 for the select all, assert.containsN( @@ -1448,7 +1448,7 @@ QUnit.module("Fields", (hooks) => { "autocomplete should contain Start typing..." ); - await clickOpenedDropdownItem(target, "partner_ids", "View all"); + await clickOpenedDropdownItem(target, "partner_ids", "Search More..."); assert.containsN( target, @@ -1498,7 +1498,7 @@ QUnit.module("Fields", (hooks) => { await nameSearchProm; await nextTick(); - // only View all option should be available + // only Search More option should be available assert.containsOnce( $(target.querySelector(".o-autocomplete.dropdown")), "li.o_m2o_dropdown_option", @@ -1506,11 +1506,11 @@ QUnit.module("Fields", (hooks) => { ); assert.containsOnce( $(target.querySelector(".o-autocomplete.dropdown")), - "li.o_m2o_dropdown_option a:contains(View all)", - "autocomplete option should be View all" + "li.o_m2o_dropdown_option a:contains(Search More...)", + "autocomplete option should be Search More" ); - await clickOpenedDropdownItem(target, "partner_ids", "View all"); + await clickOpenedDropdownItem(target, "partner_ids", "Search More..."); assert.containsN( document.body, @@ -1538,7 +1538,7 @@ QUnit.module("Fields", (hooks) => { await nameSearchProm; await nextTick(); - // only View all option should be available + // only Search More option should be available assert.containsOnce( $(target.querySelector(".o-autocomplete.dropdown")), "li.o_m2o_dropdown_option", @@ -1546,8 +1546,8 @@ QUnit.module("Fields", (hooks) => { ); assert.containsOnce( $(target.querySelector(".o-autocomplete.dropdown")), - "li.o_m2o_dropdown_option a:contains(View all)", - "autocomplete option should be View all" + "li.o_m2o_dropdown_option a:contains(Search More)", + "autocomplete option should be Search More" ); }); @@ -1733,7 +1733,7 @@ QUnit.module("Fields", (hooks) => { assert.strictEqual( target.querySelector(".o_field_many2many_tags .o-autocomplete--dropdown-menu") .textContent, - "goldsilverView all" + "goldsilverSearch More..." ); }); diff --git a/addons/web/static/tests/views/fields/many2one_avatar_field_tests.js b/addons/web/static/tests/views/fields/many2one_avatar_field_tests.js index b0c875a4778..b8aaf405c60 100644 --- a/addons/web/static/tests/views/fields/many2one_avatar_field_tests.js +++ b/addons/web/static/tests/views/fields/many2one_avatar_field_tests.js @@ -395,7 +395,9 @@ QUnit.module("Fields", (hooks) => { ); // load more - await click(document.querySelector(".o-overlay-container .o_m2o_dropdown_option_view_all")); + await click( + document.querySelector(".o-overlay-container .o_m2o_dropdown_option_search_more") + ); await click(document.querySelector(".o_dialog .o_list_table .o_data_row .o_data_cell")); assert.strictEqual( target.querySelector( diff --git a/addons/web/static/tests/views/fields/many2one_field_tests.js b/addons/web/static/tests/views/fields/many2one_field_tests.js index 9392047b15a..bc4b12339b1 100644 --- a/addons/web/static/tests/views/fields/many2one_field_tests.js +++ b/addons/web/static/tests/views/fields/many2one_field_tests.js @@ -601,7 +601,7 @@ QUnit.module("Fields", (hooks) => { `, }); - await selectDropdownItem(target, "trululu", "View all"); + await selectDropdownItem(target, "trululu", "Search More..."); assert.strictEqual($("tr.o_data_row").length, 9, "should display 9 records"); assert.equal(target.querySelector(".o_field_widget[name=trululu] input").value, "aaa"); @@ -615,7 +615,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test( - "many2ones: Open the selection dialog several times using the 'View all' button with a context containing 'search_default_...'", + "many2ones: Open the selection dialog several times using the 'Search More...' button with a context containing 'search_default_...'", async function (assert) { for (let i = 5; i < 11; i++) { serverData.models.partner.records.push({ id: i, display_name: `Partner ${i}` }); @@ -647,7 +647,7 @@ QUnit.module("Fields", (hooks) => { `, }); - await selectDropdownItem(target, "trululu", "View all"); + await selectDropdownItem(target, "trululu", "Search More..."); let modal = target.querySelector(".modal"); assert.containsOnce(modal, ".o_data_row", "should display 1 records"); @@ -656,7 +656,7 @@ QUnit.module("Fields", (hooks) => { await click(modal, ".btn-close"); assert.containsNone(modal, ".modal"); - await selectDropdownItem(target, "trululu", "View all"); + await selectDropdownItem(target, "trululu", "Search More..."); modal = target.querySelector(".modal"); assert.containsOnce(modal, ".o_data_row", "should display 1 records"); assert.deepEqual(getFacetTexts(modal), ["Displayed name\nPartner 10"]); @@ -1013,7 +1013,7 @@ QUnit.module("Fields", (hooks) => { assert.containsOnce( target, ".dropdown-menu li.o_m2o_dropdown_option", - "autocomplete should contain the View all dropdown option" + "autocomplete should contain the Search More dropdown option" ); assert.containsOnce( target, @@ -1086,7 +1086,7 @@ QUnit.module("Fields", (hooks) => { QUnit.test("many2one in edit mode", async function (assert) { assert.expect(17); - // create 10 partners + // create 10 partners to have the 'Search More' option in the autocomplete dropdown for (let i = 0; i < 10; i++) { const id = 20 + i; serverData.models.partner.records.push({ id, display_name: `Partner ${id}` }); @@ -1143,7 +1143,7 @@ QUnit.module("Fields", (hooks) => { assert.containsOnce( dropdown, "li.o_m2o_dropdown_option", - 'autocomplete should contain "View all"' + 'autocomplete should contain "Search More"' ); assert.containsNone( dropdown, @@ -1168,11 +1168,11 @@ QUnit.module("Fields", (hooks) => { "value of the m2o should have been correctly updated" ); - // change the value of the m2o with a record in the 'View allodal + // change the value of the m2o with a record in the 'Search More' modal await clickDropdown(target, "trululu"); - // click on 'View all' (mouseenter required by ui-autocomplete) + // click on 'Search More' (mouseenter required by ui-autocomplete) dropdown = target.querySelector(".o_field_many2one[name='trululu'] .dropdown-menu"); - await click(dropdown.querySelector(".o_m2o_dropdown_option_view_all")); + await click(dropdown.querySelector(".o_m2o_dropdown_option_search_more")); assert.containsOnce( target, ".modal .o_list_view", @@ -1905,7 +1905,7 @@ QUnit.module("Fields", (hooks) => { `, - mockRPC(route, { method, args }) { + mockRPC(route, { method, args}) { if (method === "read" && args[1].length === 1 && args[1][0] === "display_name") { throw new Error("read(['display_name']) should not be called"); } @@ -1945,11 +1945,7 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { method, args }) { - if ( - method === "read" && - args[1].length === 1 && - args[1][0] === "display_name" - ) { + if (method === "read" && args[1].length === 1 && args[1][0] === "display_name") { throw new Error("read(['display_name']) should not be called"); } }, @@ -3294,7 +3290,7 @@ QUnit.module("Fields", (hooks) => { assert.containsNone(target, ".ui-autocomplete a:contains(Create and Edit)"); await editInput(target, ".o_field_many2one[name=product_id] input", ""); - await clickOpenedDropdownItem(target, "product_id", "View all"); + await clickOpenedDropdownItem(target, "product_id", "Search More..."); assert.containsOnce(target, ".modal-dialog.modal-lg"); @@ -3747,7 +3743,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("search more in many2one: no text in input", async function (assert) { - // when the user clicks on 'View all' in a many2one dropdown, and there is no text + // when the user clicks on 'Search More...' in a many2one dropdown, and there is no text // in the input (i.e. no value to search on), we bypass the name_search that is meant to // return a list of preselected ids to filter on in the list view (opened in a dialog) assert.expect(7); @@ -3785,7 +3781,7 @@ QUnit.module("Fields", (hooks) => { await triggerEvent(field, null, "change"); await click(target, `.o_field_widget[name="trululu"] input`); - await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_view_all`); + await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_search_more`); assert.verifySteps([ "get_views", // main form view @@ -3797,7 +3793,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("search more in many2one: text in input", async function (assert) { - // when the user clicks on 'View all' in a many2one dropdown, and there is some + // when the user clicks on 'Search More...' in a many2one dropdown, and there is some // text in the input, we perform a name_search to get a (limited) list of preselected // ids and we add a dynamic filter (with those ids) to the search view in the dialog, so // that the user can remove this filter to bypass the limit @@ -3832,7 +3828,7 @@ QUnit.module("Fields", (hooks) => { await click(target, `.o_field_widget[name="trululu"] input`); await editInput(target, ".o_field_widget[name='trululu'] input", "test"); - await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_view_all`); + await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_search_more`); assert.containsOnce(target, ".modal .o_list_view"); assert.containsOnce( @@ -3879,7 +3875,7 @@ QUnit.module("Fields", (hooks) => { await click(target, `.o_field_widget[name="trululu"] input`); await editInput(target, ".o_field_widget[name='trululu'] input", "test"); - await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_view_all`); + await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_search_more`); // dropdown selector const searchDropdown = ".o_control_panel_actions .o-dropdown"; @@ -3952,7 +3948,7 @@ QUnit.module("Fields", (hooks) => { }); QUnit.test("search more in many2one: resequence inside dialog", async function (assert) { - // when the user clicks on 'View all' in a many2one dropdown, resequencing inside + // when the user clicks on 'Search More...' in a many2one dropdown, resequencing inside // the dialog works serverData.models.partner.fields.sequence = { string: "Sequence", type: "integer" }; for (let i = 0; i < 8; i++) { @@ -3985,7 +3981,7 @@ QUnit.module("Fields", (hooks) => { }); await editInput(target, ".o_field_widget[name='trululu'] input", ""); - await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_view_all`); + await click(target, `.o_field_widget[name="trululu"] .o_m2o_dropdown_option_search_more`); assert.containsOnce(target, ".modal"); assert.containsN(target, ".modal .ui-sortable-handle", 11); @@ -4081,7 +4077,7 @@ QUnit.module("Fields", (hooks) => { arch: '
', }); - await selectDropdownItem(target, "trululu", "View all"); + await selectDropdownItem(target, "trululu", "Search More..."); const modal = target.querySelector(".modal"); await toggleSearchBarMenu(modal); await toggleMenuItem(modal, "Bar"); @@ -4181,7 +4177,7 @@ QUnit.module("Fields", (hooks) => { `, }); - await selectDropdownItem(target, "trululu", "View all"); + await selectDropdownItem(target, "trululu", "Search More..."); const modal = target.querySelector(".modal"); await click(modal, ".o_pager_next"); diff --git a/addons/web/static/tests/views/fields/properties_field_tests.js b/addons/web/static/tests/views/fields/properties_field_tests.js index 0337bd4f155..bb1efd779a2 100644 --- a/addons/web/static/tests/views/fields/properties_field_tests.js +++ b/addons/web/static/tests/views/fields/properties_field_tests.js @@ -1245,7 +1245,7 @@ QUnit.module("Fields", (hooks) => { // Opening the "Search more..." modal await click(popover, ".o_field_property_definition_value input"); - await click(popover, ".o_m2o_dropdown_option_view_all"); + await click(popover, ".o_m2o_dropdown_option_search_more"); // Checking the model loaded assert.verifySteps(["partner"]); @@ -1259,7 +1259,7 @@ QUnit.module("Fields", (hooks) => { // Opening the "Search more..." modal await click(popover, ".o_field_property_definition_value input"); - await click(popover, ".o_m2o_dropdown_option_view_all"); + await click(popover, ".o_m2o_dropdown_option_search_more"); // Checking the model loaded assert.verifySteps(["res.users"]); diff --git a/addons/web/static/tests/views/list_view_tests.js b/addons/web/static/tests/views/list_view_tests.js index b7d3706f931..5c11bad4e91 100644 --- a/addons/web/static/tests/views/list_view_tests.js +++ b/addons/web/static/tests/views/list_view_tests.js @@ -5754,6 +5754,7 @@ QUnit.module("Views", (hooks) => { }); QUnit.test("custom delete confirmation dialog", async (assert) => { + const listView = registry.category("views").get("list"); class CautiousController extends listView.Controller { get deleteConfirmationDialogProps() { @@ -5793,12 +5794,7 @@ QUnit.module("Views", (hooks) => { ); await click(document, "body .modal footer button.btn-secondary"); - assert.containsN( - target, - "tbody td.o_list_record_selector", - 4, - "nothing deleted, 4 records remain" - ); + assert.containsN(target, "tbody td.o_list_record_selector", 4, "nothing deleted, 4 records remain"); }); QUnit.test( @@ -8517,10 +8513,10 @@ QUnit.module("Views", (hooks) => { "the entire content should be selected on initial click" ); - Object.assign(target.querySelector("[name=text] textarea"), { - selectionStart: 0, - selectionEnd: 1, - }); + Object.assign( + target.querySelector("[name=text] textarea"), + { selectionStart: 0, selectionEnd: 1 } + ); await click(target, "[name=text] textarea"); @@ -10489,7 +10485,7 @@ QUnit.module("Views", (hooks) => { await click(target.querySelector(".o_data_cell")); await clickOpenM2ODropdown(target, "m2o"); - await clickOpenedDropdownItem(target, "m2o", "View all"); + await clickOpenedDropdownItem(target, "m2o", "Search More..."); assert.containsOnce(target, ".modal-content"); assert.containsNone( target, @@ -11882,7 +11878,7 @@ QUnit.module("Views", (hooks) => { await click(rows[0], ".o_list_record_selector input"); await click(rows[1], ".o_list_record_selector input"); await click(rows[0].querySelector(".o_data_cell")); - await selectDropdownItem(target, "m2m", "View all"); + await selectDropdownItem(target, "m2m", "Search More..."); assert.containsOnce(document.body, ".modal", "should have open the modal"); await click(target.querySelector(".modal .o_data_row .o_field_cell")); @@ -17896,22 +17892,19 @@ QUnit.module("Views", (hooks) => { assert.strictEqual(td2.textContent, "61%"); }); - QUnit.test( - "Formatted group operator with digit precision on the field definition", - async function (assert) { - serverData.models.foo.fields.qux.digits = [16, 3]; - await makeView({ - type: "list", - resModel: "foo", - serverData, - arch: '', - groupBy: ["bar"], - }); - const [td1, td2] = target.querySelectorAll("td.o_list_number"); - assert.strictEqual(td1.textContent, "9.000"); - assert.strictEqual(td2.textContent, "10.400"); - } - ); + QUnit.test("Formatted group operator with digit precision on the field definition", async function (assert) { + serverData.models.foo.fields.qux.digits = [16, 3]; + await makeView({ + type: "list", + resModel: "foo", + serverData, + arch: '', + groupBy: ["bar"], + }); + const [td1, td2] = target.querySelectorAll("td.o_list_number"); + assert.strictEqual(td1.textContent, "9.000"); + assert.strictEqual(td2.textContent, "10.400"); + }); QUnit.test("list view does not crash when clicked button cell", async function (assert) { await makeView({ @@ -18282,7 +18275,7 @@ QUnit.module("Views", (hooks) => { await click(target, ".o_data_row:nth-child(1) td.o_list_many2one"); await click(target, ".o_field_many2one_selection .o-autocomplete--input"); - await clickOpenedDropdownItem(target, "m2o", "View all"); + await clickOpenedDropdownItem(target, "m2o", "Search More..."); assert.verifySteps([]); @@ -19429,7 +19422,7 @@ QUnit.module("Views", (hooks) => { const items = Array.from( target.querySelectorAll(".o_selected_row .o_field_many2many_tags .dropdown-item") ); - await click(items.find((el) => el.textContent.trim() === "View all")); + await click(items.find((el) => el.textContent.trim() === "Search More...")); assert.verifySteps([ `bar: get_views: {"lang":"en","uid":7,"tz":"taht"}`, `bar: web_search_read: {"lang":"en","uid":7,"tz":"taht","bin_size":true}`, @@ -19443,16 +19436,16 @@ QUnit.module("Views", (hooks) => { QUnit.test("search nested many2one field with early option selection", async (assert) => { const deferred = makeDeferred(); - (serverData.models.parent = { + serverData.models.parent = { fields: { foo: { string: "Foo", type: "one2many", relation: "foo" }, }, - }), - await makeView({ - type: "form", - resModel: "parent", - serverData, - arch: ` + }, + await makeView({ + type: "form", + resModel: "parent", + serverData, + arch: `
@@ -19460,29 +19453,30 @@ QUnit.module("Views", (hooks) => {
`, - mockRPC: async (route, { method }) => { - if (method === "name_search") { - await deferred; - } - }, - }); + mockRPC: async (route, { method }) => { + if (method === "name_search") { + await deferred; + } + }, + }); - await triggerEvent(document.querySelector(".o_field_x2many_list_row_add a"), null, "click"); + await triggerEvent(document.querySelector('.o_field_x2many_list_row_add a'), null, "click"); const input = document.activeElement; - input.value = "alu"; - triggerEvent(document.activeElement, null, "input"), await nextTick(); - - input.value = "alue"; + input.value = 'alu'; triggerEvent(document.activeElement, null, "input"), - triggerHotkey("Enter"), - await nextTick(); + await nextTick(); + + input.value = 'alue'; + triggerEvent(document.activeElement, null, "input"), + triggerHotkey("Enter"), + await nextTick(); deferred.resolve(); await nextTick(); assert.strictEqual(input, document.activeElement); - assert.strictEqual(input.value, "Value 1"); + assert.strictEqual(input.value, 'Value 1'); }); QUnit.test("monetary field display for rtl languages", async function (assert) {