summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorJulien Mougenot <jum@odoo.com>2020-04-16 15:09:47 +0000
committerJulien Mougenot <jum@odoo.com>2020-04-17 14:21:02 +0000
commit7ace5a986a042ced675fb821bbf527d2d69ca614 (patch)
tree1dbd94412506f49a3373973f6662f25462873c47 /addons/web/static/src/js
parentb3149d84a0253fad63ae00880d9e832e7bfe9057 (diff)
[FIX] web,lunch: separate search panel domain
Before this commit, the SearchPanel widget was given a single unified domain coming from the view/controller. The issue was that some modules injected additional leaves in this domain and there was no way to remove them/separate them from the original view/controller domain. Now, another paramater (the `viewDomain`) is given to the SearchPanel, containing the distinct domain related to the view. The Lunch module has been adapted to give the `location` domain through this new key. Note that some tests steps had to be inverted since the method retreiving the domain of the view/controller is asynchronous (needed by Lunch to give time to the model to be loaded). It mainly concerns the RPC order which does not matter in this case. Task 2239706 closes odoo/odoo#49720 X-original-commit: e895e553899933be14c8abfd8c676b44a7f534d8 Signed-off-by: Julien Mougenot (jum) <jum@odoo.com> Signed-off-by: Aaron Bohy (aab) <aab@odoo.com>
Diffstat (limited to 'addons/web/static/src/js')
-rw-r--r--addons/web/static/src/js/views/abstract_controller.js17
-rw-r--r--addons/web/static/src/js/views/abstract_view.js13
-rw-r--r--addons/web/static/src/js/views/search_panel.js12
3 files changed, 30 insertions, 12 deletions
diff --git a/addons/web/static/src/js/views/abstract_controller.js b/addons/web/static/src/js/views/abstract_controller.js
index 09451cdcbfa..866abb03d65 100644
--- a/addons/web/static/src/js/views/abstract_controller.js
+++ b/addons/web/static/src/js/views/abstract_controller.js
@@ -228,7 +228,11 @@ var AbstractController = mvc.Controller.extend(ActionMixin, {
this._searchPanel.importState(controllerState.spState);
this.searchPanelDomain = this._searchPanel.getDomain();
} else {
- searchPanelUpdateProm = this._searchPanel.update({searchDomain: this._getSearchDomain()});
+ const viewDomain = await this._getViewDomain();
+ searchPanelUpdateProm = this._searchPanel.update({
+ searchDomain: this.controlPanelDomain,
+ viewDomain,
+ });
postponeRendering = !params.noRender;
params.noRender = true; // wait for searchpanel to be ready to render
}
@@ -299,16 +303,13 @@ var AbstractController = mvc.Controller.extend(ActionMixin, {
return null;
},
/**
- * Return the current search domain. This is the searchDomain used to update
- * the searchpanel. It returns the domain coming from the controlpanel. This
- * function can be overridden to add sub-domains coming from other parts of
- * the interface.
+ * Get the domain defined by the view. It is meant to be overridden.
*
* @private
- * @returns {Array[]}
+ * @returns {Promise<Array[]>}
*/
- _getSearchDomain: function () {
- return this.controlPanelDomain;
+ _getViewDomain: async function () {
+ return [];
},
/**
* Meant to be overriden to return a proper object.
diff --git a/addons/web/static/src/js/views/abstract_view.js b/addons/web/static/src/js/views/abstract_view.js
index c720a2a515e..4cd503ff480 100644
--- a/addons/web/static/src/js/views/abstract_view.js
+++ b/addons/web/static/src/js/views/abstract_view.js
@@ -296,9 +296,11 @@ var AbstractView = Factory.extend({
}
});
var controlPanelDomain = this.loadParams.domain;
+ const viewDomain = await this._getViewDomain(parent);
var spParams = _.extend({}, this.searchPanelParams, {
defaultValues: defaultValues,
searchDomain: controlPanelDomain,
+ viewDomain,
classes: params.classes || [],
});
var searchPanel = new this.config.SearchPanel(parent, spParams);
@@ -352,6 +354,17 @@ var AbstractView = Factory.extend({
};
},
/**
+ * Get the domain defined by the view. It is meant to be overridden. The parent
+ * is provided in case some subcomponents need to be retrieved.
+ *
+ * @private
+ * @param {Object} parent
+ * @returns {Promise<Array[]>}
+ */
+ _getViewDomain: async function (parent) {
+ return [];
+ },
+ /**
* Processes a fieldsView. In particular, parses its arch.
*
* @private
diff --git a/addons/web/static/src/js/views/search_panel.js b/addons/web/static/src/js/views/search_panel.js
index 590d52e4941..377eb723621 100644
--- a/addons/web/static/src/js/views/search_panel.js
+++ b/addons/web/static/src/js/views/search_panel.js
@@ -83,6 +83,7 @@ var SearchPanel = Widget.extend({
* @param {Object} params.fields
* @param {string} params.model
* @param {Array[]} params.searchDomain domain coming from controlPanel
+ * @param {Array[]} params.viewDomain domain coming from the view (ill advised)
* @param {Object} params.sections
* @param {Object} [params.state] state exported by another searchpanel
* instance
@@ -110,6 +111,7 @@ var SearchPanel = Widget.extend({
this.model = params.model;
this.className = params.classes.concat(['o_search_panel']).join(' ');
this.searchDomain = params.searchDomain;
+ this.viewDomain = params.viewDomain;
},
/**
* @override
@@ -229,15 +231,17 @@ var SearchPanel = Widget.extend({
*
* @param {Object} params
* @param {Array[]} params.searchDomain domain coming from controlPanel
+ * @param {Array[]} params.viewDomain domain coming from view
* @returns {Promise}
*/
update: function (params) {
- var currentSearchDomainStr = JSON.stringify(this.searchDomain);
- var newSearchDomainStr = JSON.stringify(params.searchDomain);
+ const currentDomain = JSON.stringify([...this.searchDomain, ...this.viewDomain]);
+ const newDomain = JSON.stringify([...params.searchDomain, ...params.viewDomain]);
var filtersProm;
- if (this.needReload || (currentSearchDomainStr !== newSearchDomainStr)) {
+ if (this.needReload || (currentDomain !== newDomain)) {
this.needReload = false;
this.searchDomain = params.searchDomain;
+ this.viewDomain = params.viewDomain;
filtersProm = this._fetchFilters();
}
return Promise.resolve(filtersProm).then(this._render.bind(this));
@@ -431,7 +435,7 @@ var SearchPanel = Widget.extend({
disable_counters: filter.disableCounters,
filter_domain: filterDomain,
group_by: filter.groupBy || false,
- search_domain: self.searchDomain,
+ search_domain: [...self.searchDomain, ...self.viewDomain],
},
}).then(function (values) {
self._createFilterTree(filterId, values);