diff options
| author | Aaron Bohy <aab@odoo.com> | 2017-06-01 16:01:54 +0200 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2017-06-01 20:45:06 +0200 |
| commit | 719e040dee8d7c319eb77f61893fd8eb8b7f4636 (patch) | |
| tree | 2b82c4701f010b6b5d0e7ad7ec7249f422f2ca99 /addons/web/static | |
| parent | 1749ac2cd1c29311a1b1a5ab0863529211022434 (diff) | |
[FIX] web: Many2One: search with input's value
When the user writes something in a Many2One input, after a short
delay, a name_search RPC is done with the value written in the
input, and results are displayed in a dropdown. Then, if the user
clicks on the input, the dropdown closes. If he clicks again, it
should do again a name_search RPC with the value of the input.
Before this rev., it was doing it with the empty string.
Diffstat (limited to 'addons/web/static')
| -rw-r--r-- | addons/web/static/src/js/fields/relational_fields.js | 8 | ||||
| -rw-r--r-- | addons/web/static/tests/fields/relational_fields_tests.js | 52 |
2 files changed, 58 insertions, 2 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js index a5f9b443ae0..d825f46b62b 100644 --- a/addons/web/static/src/js/fields/relational_fields.js +++ b/addons/web/static/src/js/fields/relational_fields.js @@ -105,7 +105,9 @@ var FieldMany2One = AbstractField.extend({ this.recordParams = {fieldName: this.name, viewType: this.viewType}; }, start: function () { - // what is 'this.floating' for? add a comment! + // booleean indicating that the content of the input isn't synchronized + // with the current m2o value (for instance, the user is currently + // typing something in the input, and hasn't selected a value yet). this.floating = false; this.$input = this.$('input'); @@ -453,8 +455,10 @@ var FieldMany2One = AbstractField.extend({ _onInputClick: function () { if (this.$input.autocomplete("widget").is(":visible")) { this.$input.autocomplete("close"); + } else if (this.floating) { + this.$input.autocomplete("search"); // search with the input's content } else { - this.$input.autocomplete("search", ""); + this.$input.autocomplete("search", ''); // search with the empty string } }, /** diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 73aa28730e2..3027314d5fa 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -363,6 +363,58 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('many2one searches with correct value', function (assert) { + var done = assert.async(); + assert.expect(6); + + var M2O_DELAY = relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY; + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = 0; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners">' + + '<sheet>' + + '<field name="trululu"/>' + + '</sheet>' + + '</form>', + res_id: 1, + mockRPC: function (route, args) { + if (args.method === 'name_search') { + assert.step('search: ' + args.kwargs.name); + } + return this._super.apply(this, arguments); + }, + viewOptions: { + mode: 'edit', + }, + }); + + assert.strictEqual(form.$('.o_field_many2one input').val(), 'aaa', + "should be initially set to 'aaa'"); + + form.$('.o_field_many2one input').click(); // should search with '' + // unset the many2one -> should search again with '' + form.$('.o_field_many2one input').val('').trigger('keydown'); + concurrency.delay(0).then(function () { + // write 'p' -> should search with 'p' + form.$('.o_field_many2one input').val('p').trigger('keydown').trigger('keyup'); + + return concurrency.delay(0); + }).then(function () { + // close and re-open the dropdown -> should search with 'p' again + form.$('.o_field_many2one input').click(); + form.$('.o_field_many2one input').click(); + + assert.verifySteps(['search: ', 'search: ', 'search: p', 'search: p']); + + relationalFields.FieldMany2One.prototype.AUTOCOMPLETE_DELAY = M2O_DELAY; + form.destroy(); + done(); + }); + }); + QUnit.test('many2one field with option always_reload', function (assert) { assert.expect(4); var count = 0; |
