summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--addons/web/models/models.py6
-rw-r--r--addons/web/static/src/js/views/search_panel.js8
-rw-r--r--addons/web/static/tests/helpers/mock_server.js6
-rw-r--r--addons/web/static/tests/views/search_panel_tests.js61
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);