diff options
| author | Julien Mougenot <jum@odoo.com> | 2020-04-16 15:09:47 +0000 |
|---|---|---|
| committer | Julien Mougenot <jum@odoo.com> | 2020-04-17 14:21:02 +0000 |
| commit | 7ace5a986a042ced675fb821bbf527d2d69ca614 (patch) | |
| tree | 1dbd94412506f49a3373973f6662f25462873c47 /addons/web/static | |
| parent | b3149d84a0253fad63ae00880d9e832e7bfe9057 (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')
| -rw-r--r-- | addons/web/static/src/js/views/abstract_controller.js | 17 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/abstract_view.js | 13 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/search_panel.js | 12 |
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); |
