summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields/relational_fields.js
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2019-02-19 10:10:47 +0000
committerAaron Bohy <aab@odoo.com>2019-02-26 08:26:51 +0000
commit6a8e1b53e3a01a74aa21b834964994e8d186b653 (patch)
tree5c0d9090324775757300692ef1d4c7b6281ec15f /addons/web/static/src/js/fields/relational_fields.js
parenta76a958ca8479c3ea0c480bac730f7bfd62ce1d5 (diff)
[FIX] web: search more in many2one: filter on ids
Let's assume a many2one field with a lot of possible values. The user clicks on 'Search More...'. In the opened dialog, only 160 records are available (their ids have been obtained with a name_search, with the optional text the user could have typed in the many2one input). Before 4cd379cf, that extra domain on ids was removed automatically as soon as the user interacted with the search view in the dialog. This was especially useful when there were more than 160 records. However, this was rather an happy coincidence than a designed feature. From 4cd379cf, the ids selection was added to the initial domain of the list, so they couldn't be removed from the domain afterwards. The user was thus stucked with its preselected 160 records. This rev. doesn't restore the former behavior, but rather improves the current one, as follows: - when there is no text in the many2one input (i.e. no value to filter on), we bypass the name_search, s.t. all records are available in the dialog - when there is some text in the input, we perform a name_search (as before) to get a list of record ids, and we add a special filter to the search view in the dialog (the filter on those ids), s.t. the user can remove it if he wants to access the remaining records. - finally, the limit is now set to 320, to mitigate the problem Issue reported on the saas-12.1 migration pad. closes odoo/odoo#31232
Diffstat (limited to 'addons/web/static/src/js/fields/relational_fields.js')
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js34
1 files changed, 28 insertions, 6 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index 14eb10c663c..6005c9f1a66 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -107,6 +107,7 @@ var FieldMany2One = AbstractField.extend({
'click': '_onClick',
}),
AUTOCOMPLETE_DELAY: 200,
+ SEARCH_MORE_LIMIT: 320,
/**
* @override
@@ -501,18 +502,33 @@ var FieldMany2One = AbstractField.extend({
values.push({
label: _t("Search More..."),
action: function () {
- self._rpc({
+ var prom;
+ if (search_val !== '') {
+ prom = self._rpc({
model: self.field.relation,
method: 'name_search',
kwargs: {
name: search_val,
args: domain,
operator: "ilike",
- limit: 160,
+ limit: self.SEARCH_MORE_LIMIT,
context: context,
},
- })
- .then(self._searchCreatePopup.bind(self, "search"));
+ });
+ }
+ $.when(prom).then(function (results) {
+ var dynamicFilters;
+ if (results) {
+ var ids = _.map(results, function (x) {
+ return x[0];
+ });
+ dynamicFilters = [{
+ description: _.str.sprintf(_t('Quick search: %s'), search_val),
+ domain: [['id', 'in', ids]],
+ }];
+ }
+ self._searchCreatePopup("search", false, {}, dynamicFilters);
+ });
},
classname: 'o_m2o_dropdown_option',
});
@@ -555,19 +571,25 @@ var FieldMany2One = AbstractField.extend({
/**
* all search/create popup handling
*
+ * TODO: ids argument is no longer used, remove it in master (as well as
+ * initial_ids param of the dialog)
+ *
* @private
* @param {any} view
* @param {any} ids
* @param {any} context
+ * @param {Object[]} [dynamicFilters=[]] filters to add to the search view
+ * in the dialog (each filter has keys 'description' and 'domain')
*/
- _searchCreatePopup: function (view, ids, context) {
+ _searchCreatePopup: function (view, ids, context, dynamicFilters) {
var self = this;
return new dialogs.SelectCreateDialog(this, _.extend({}, this.nodeOptions, {
res_model: this.field.relation,
domain: this.record.getDomain({fieldName: this.name}),
context: _.extend({}, this.record.getContext(this.recordParams), context || {}),
+ dynamicFilters: dynamicFilters || [],
title: (view === 'search' ? _t("Search: ") : _t("Create: ")) + this.string,
- initial_ids: ids ? _.map(ids, function (x) { return x[0]; }) : undefined,
+ initial_ids: ids,
initial_view: view,
disable_multiple_selection: true,
no_create: !self.can_create,