diff --git a/addons/web/static/src/js/core/domain.js b/addons/web/static/src/js/core/domain.js index dbf2b18eb40..a1d6e7e7c49 100644 --- a/addons/web/static/src/js/core/domain.js +++ b/addons/web/static/src/js/core/domain.js @@ -106,20 +106,31 @@ var Domain = collections.Tree.extend({ return _.intersection( _.isArray(this._data[2]) ? this._data[2] : [this._data[2]], _.isArray(fieldValue) ? fieldValue : [fieldValue], - ).length !== 0;; + ).length !== 0; case "not in": return _.intersection( _.isArray(this._data[2]) ? this._data[2] : [this._data[2]], _.isArray(fieldValue) ? fieldValue : [fieldValue], ).length === 0; case "like": - return (fieldValue.toLowerCase().indexOf(this._data[2].toLowerCase()) >= 0); - case "=like": - var regExp = new RegExp(this._data[2].toLowerCase().replace(/([.\[\]\{\}\+\*])/g, '\\\$1').replace(/%/g, '.*')); - return regExp.test(fieldValue.toLowerCase()); - case "ilike": + if (fieldValue === false) { + return false; + } return (fieldValue.indexOf(this._data[2]) >= 0); + case "=like": + if (fieldValue === false) { + return false; + } + return new RegExp(this._data[2].replace(/%/g, '.*')).test(fieldValue); + case "ilike": + if (fieldValue === false) { + return false; + } + return (fieldValue.toLowerCase().indexOf(this._data[2].toLowerCase()) >= 0); case "=ilike": + if (fieldValue === false) { + return false; + } return new RegExp(this._data[2].replace(/%/g, '.*'), 'i').test(fieldValue); default: throw new Error(_.str.sprintf( diff --git a/addons/web/static/tests/core/domain_tests.js b/addons/web/static/tests/core/domain_tests.js index ff30c53fc0f..fd94db6ec64 100644 --- a/addons/web/static/tests/core/domain_tests.js +++ b/addons/web/static/tests/core/domain_tests.js @@ -158,5 +158,29 @@ QUnit.module('core', {}, function () { assert.strictEqual(arrayToString(), '[]'); }); + + QUnit.test("like, =like, ilike and =ilike", function (assert) { + assert.expect(16); + + assert.ok(new Domain([['a', 'like', 'value']]).compute({ a: 'value' })); + assert.ok(new Domain([['a', 'like', 'value']]).compute({ a: 'some value' })); + assert.notOk(new Domain([['a', 'like', 'value']]).compute({ a: 'Some Value' })); + assert.notOk(new Domain([['a', 'like', 'value']]).compute({ a: false })); + + assert.ok(new Domain([['a', '=like', '%value']]).compute({ a: 'value' })); + assert.ok(new Domain([['a', '=like', '%value']]).compute({ a: 'some value' })); + assert.notOk(new Domain([['a', '=like', '%value']]).compute({ a: 'Some Value' })); + assert.notOk(new Domain([['a', '=like', '%value']]).compute({ a: false })); + + assert.ok(new Domain([['a', 'ilike', 'value']]).compute({ a: 'value' })); + assert.ok(new Domain([['a', 'ilike', 'value']]).compute({ a: 'some value' })); + assert.ok(new Domain([['a', 'ilike', 'value']]).compute({ a: 'Some Value' })); + assert.notOk(new Domain([['a', 'ilike', 'value']]).compute({ a: false })); + + assert.ok(new Domain([['a', '=ilike', '%value']]).compute({ a: 'value' })); + assert.ok(new Domain([['a', '=ilike', '%value']]).compute({ a: 'some value' })); + assert.ok(new Domain([['a', '=ilike', '%value']]).compute({ a: 'Some Value' })); + assert.notOk(new Domain([['a', '=ilike', '%value']]).compute({ a: false })); + }); }); });