diff options
| -rw-r--r-- | addons/web/models/models.py | 6 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/search_panel.js | 8 | ||||
| -rw-r--r-- | addons/web/static/tests/helpers/mock_server.js | 6 | ||||
| -rw-r--r-- | addons/web/static/tests/views/search_panel_tests.js | 61 |
4 files changed, 75 insertions, 6 deletions
diff --git a/addons/web/models/models.py b/addons/web/models/models.py index f98a3d8c7bb..f4bcdb9be06 100644 --- a/addons/web/models/models.py +++ b/addons/web/models/models.py @@ -456,6 +456,7 @@ class Base(models.AbstractModel): :param expand: whether to return the full range of field values in comodel_domain or only the field image values (possibly filtered and/or completed with parents if hierarchize is set). Default is False. + :param filter_domain: domain generated by filters. Default is []. :param hierarchize: determines if the categories must be displayed hierarchically (if possible). If set to true and _parent_name is set on the comodel field, the information necessary for the hierarchization will @@ -479,7 +480,10 @@ class Base(models.AbstractModel): 'supported_types': supported_types, 'field_type': field.type})) model_domain = kwargs.get('search_domain', []) - extra_domain = kwargs.get('category_domain', []) + extra_domain = AND([ + kwargs.get('category_domain', []), + kwargs.get('filter_domain', []), + ]) if field.type == 'selection': return { diff --git a/addons/web/static/src/js/views/search_panel.js b/addons/web/static/src/js/views/search_panel.js index f54fc7f1c9f..0436a8eb7f4 100644 --- a/addons/web/static/src/js/views/search_panel.js +++ b/addons/web/static/src/js/views/search_panel.js @@ -406,6 +406,7 @@ const SearchPanel = Widget.extend({ category_domain: this._getCategoryDomain(category.id), enable_counters: enableCounters, expand, + filter_domain: this._getFilterDomain(), hierarchize, limit, search_domain: this.searchDomain, @@ -643,10 +644,9 @@ const SearchPanel = Widget.extend({ * the searchPanel and the reloading of the data. * * @private - * @param {Object} [reloadOptions={}] */ - _notifyDomainUpdated(reloadOptions = {}) { - this.reloadOptions = reloadOptions; + _notifyDomainUpdated() { + this.reloadOptions = { shouldFetchCategories: true }; this.trigger_up('search_panel_domain_updated', { domain: this.getDomain(), }); @@ -744,7 +744,7 @@ const SearchPanel = Widget.extend({ if (hasChanged) { const storageKey = this._getLocalStorageKey(category); this.call('local_storage', 'setItem', storageKey, valueId); - this._notifyDomainUpdated({ shouldFetchCategories: true }); + this._notifyDomainUpdated(); } else { this._render(); } diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js index 8f3e18a6199..0dbcc6364e9 100644 --- a/addons/web/static/tests/helpers/mock_server.js +++ b/addons/web/static/tests/helpers/mock_server.js @@ -744,6 +744,7 @@ var MockServer = Class.extend({ * @param {Array[]} [kwargs.comodel_domain] domain of field values (if relational) * (this parameter is used in _search_panel_range) * @param {boolean} [kwargs.enable_counters] whether to count records by value + * @param {Array[]} [kwargs.filter_domain] domain generated by filters * @param {integer} [kwargs.limit] maximal number of values to fetch * @param {Array[]} [kwargs.search_domain] base domain of search (this parameter * is used in _search_panel_range) @@ -757,7 +758,10 @@ var MockServer = Class.extend({ } const modelDomain = kwargs.search_domain || []; - const extraDomain = kwargs.category_domain || []; + const extraDomain = Domain.prototype.normalizeArray([ + ...(kwargs.category_domain || []), + ...(kwargs.filter_domain || []), + ]); if (field.type === 'selection') { const newKwargs = Object.assign({}, kwargs, { diff --git a/addons/web/static/tests/views/search_panel_tests.js b/addons/web/static/tests/views/search_panel_tests.js index cf0014aabcb..9a7310eacca 100644 --- a/addons/web/static/tests/views/search_panel_tests.js +++ b/addons/web/static/tests/views/search_panel_tests.js @@ -2619,6 +2619,67 @@ QUnit.module('Views', { form.destroy(); }); + + QUnit.test("Reload categories with counters when filter values are selected", async function (assert) { + assert.expect(10); + + const kanban = await createView({ + View: KanbanView, + model: 'partner', + data: this.data, + mockRPC: function (route, args) { + assert.step(args.method || route); + return this._super.apply(this, arguments); + }, + services: this.services, + arch: ` + <kanban> + <templates> + <t t-name="kanban-box"> + <div> + <field name="foo"/> + </div> + </t> + </templates> + </kanban>`, + archs: { + 'partner,false,search': ` + <search> + <searchpanel> + <field name="category_id" enable_counters="1"/> + <field name="state" select="multi" enable_counters="1"/> + </searchpanel> + </search>`, + }, + }); + + assert.verifySteps([ + 'search_panel_select_range', + "search_panel_select_multi_range", + '/web/dataset/search_read' + ]); + + assert.deepEqual(getCounters(kanban), [ + 1, 3, // category counts (in order) + 1, 1, 2 // filter counts + ]); + + await testUtils.dom.click(kanban.el.querySelector('.o_search_panel_filter_value input')); + + assert.deepEqual(getCounters(kanban), [ + 1, // category counts (for silver: 0 is not displayed) + 1, 1, 2 // filter counts + ]); + + assert.verifySteps([ + 'search_panel_select_range', + '/web/dataset/search_read', + "search_panel_select_multi_range" + ]); + + kanban.destroy(); + }); + QUnit.test("many2one: select one, expand, hierarchize, counters", async function (assert) { assert.expect(5); |
