From f294079a8946e88f0564dc96bf8a9531958697fe Mon Sep 17 00:00:00 2001 From: Florian Vranckx Date: Thu, 30 Jun 2022 09:48:09 +0000 Subject: [PATCH] [FIX] web : error when filter has empty selection Steps to reproduce: - install approvals - in the approvals app go to filters>add custome filter> approval type Issue: - traceback Cause: - When no other module is installed, there is nothing to display under the approval type filter. Even if the field is not required, the javascript try to access the first element of the selection array to auto-fill the menu. Solution: Add a check, if empty and not required, do not display it and leave the field empty opw-2895516 closes odoo/odoo#96617 X-original-commit: 7fdbb1783ec65919a709e5fcac111994d0eb3cd5 Signed-off-by: Nicolas Lempereur (nle) Signed-off-by: Vranckx Florian (flvr) Co-authored-by: nle-odoo --- .../js/control_panel/custom_filter_item.js | 9 ++++-- .../control_panel/custom_filter_item_tests.js | 30 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/legacy/js/control_panel/custom_filter_item.js b/addons/web/static/src/legacy/js/control_panel/custom_filter_item.js index 2fd044d161a..10128a9345c 100644 --- a/addons/web/static/src/legacy/js/control_panel/custom_filter_item.js +++ b/addons/web/static/src/legacy/js/control_panel/custom_filter_item.js @@ -125,8 +125,13 @@ odoo.define('web.CustomFilterItem', function (require) { } break; case 'selection': - const [firstValue] = this.fields[condition.field].selection[0]; - condition.value = firstValue; + if (this.fields[condition.field].selection.length) { + const [firstValue] = this.fields[condition.field].selection[0]; + condition.value = firstValue; + } + else { + condition.value = ""; + } break; default: condition.value = ""; diff --git a/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js b/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js index a2919905d09..e51a968b6dc 100644 --- a/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js +++ b/addons/web/static/tests/legacy/control_panel/custom_filter_item_tests.js @@ -195,6 +195,36 @@ odoo.define('web.filter_menu_generator_tests', function (require) { await testUtils.fields.editSelect(target.querySelector('.o_generator_menu_value select'), 'white'); await cpHelpers.applyFilter(target); }); + QUnit.test('selection field: no value', async function (assert) { + assert.expect(2); + + this.fields.color.selection = []; + let expectedFilters; + class MockedSearchModel extends ActionModel { + dispatch(method, ...args) { + assert.strictEqual(method, 'createNewFilters'); + const preFilters = args[0]; + assert.deepEqual(preFilters, expectedFilters); + } + } + const searchModel = new MockedSearchModel(); + const cfi = await createComponent(CustomFilterItem, { + props: { + fields: this.fields, + }, + env: { searchModel }, + }); + + // Default value + expectedFilters = [{ + description: 'Color is ""', + domain: '[["color","=",""]]', + type: 'filter', + }]; + await toggleAddCustomFilterStandalone(cfi); + await testUtils.fields.editSelect(cfi.el.querySelector('.o_generator_menu_field'), 'color'); + await cpHelpers.applyFilter(cfi); + }) QUnit.test('adding a simple filter works', async function (assert) { assert.expect(7);