diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 9c8bf87902a..a5aa2364d97 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -258,6 +258,65 @@ openerp.base.FormView = openerp.base.Controller.extend( /** @lends openerp.base /** @namespace */ openerp.base.form = {}; +openerp.base.form.compute_domain = function(expr, fields) { + var stack = []; + for (var i = 0; i < expr.length; i++) { + var ex = expr[i]; + if (ex.length == 1) { + stack.push(ex[0]); + continue; + } + + var field = fields[ex[0]].value; + var op = ex[1]; + var val = ex[2]; + + switch (op.toLowerCase()) { + case '=': + case '==': + stack.push(field == val); + break; + case '!=': + case '<>': + stack.push(field != val); + break; + case '<': + stack.push(field < val); + break; + case '>': + stack.push(field > val); + break; + case '<=': + stack.push(field <= val); + break; + case '>=': + stack.push(field >= val); + break; + case 'in': + stack.push(_.indexOf(val, field) > -1); + break; + case 'not in': + stack.push(_.indexOf(val, field) == -1); + break; + default: + this.log("Unsupported operator in attrs :", op); + } + } + + for (var j = stack.length-1; j >- 1; j--) { + switch (stack[j]) { + case '|': + var result = stack[j + 1] || stack[j + 2]; + stack.splice(j, 3, result); + break; + case '&': + var result = stack[j + 1] && stack[j + 2]; + stack.splice(j, 3, result); + break; + } + } + return _.indexOf(stack, false) == -1; +}, openerp.base.form.Widget = openerp.base.Controller.extend({ init: function(view, node) { this.view = view; @@ -282,69 +341,11 @@ openerp.base.form.Widget = openerp.base.Controller.extend({ this.$element = $('#' + this.element_id); }, process_attrs: function() { + var compute_domain = openerp.base.form.compute_domain; for (var a in this.attrs) { - this[a] = this.compute_domain(this.attrs[a]); + this[a] = compute_domain(this.attrs[a], this.view.fields); } }, - compute_domain: function(expr) { - var stack = []; - for (var i = 0; i < expr.length; i++) { - var ex = expr[i]; - if (ex.length == 1) { - stack.push(ex[0]); - continue; - } - - var field = this.view.fields[ex[0]].value; - var op = ex[1]; - var val = ex[2]; - - switch (op.toLowerCase()) { - case '=': - case '==': - stack.push(field == val); - break; - case '!=': - case '<>': - stack.push(field != val); - break; - case '<': - stack.push(field < val); - break; - case '>': - stack.push(field > val); - break; - case '<=': - stack.push(field <= val); - break; - case '>=': - stack.push(field >= val); - break; - case 'in': - stack.push(_.indexOf(val, field) > -1); - break; - case 'not in': - stack.push(_.indexOf(val, field) == -1); - break; - default: - this.log("Unsupported operator in attrs :", op); - } - } - - for (var j = stack.length-1; j >- 1; j--) { - switch (stack[j]) { - case '|': - var result = stack[j + 1] || stack[j + 2]; - stack.splice(j, 3, result); - break; - case '&': - var result = stack[j + 1] && stack[j + 2]; - stack.splice(j, 3, result); - break; - } - } - return _.indexOf(stack, false) == -1; - }, update_dom: function() { this.$element.toggle(!this.invisible); }, diff --git a/addons/base/static/test/form.js b/addons/base/static/test/form.js index 9d61bf6d60a..0cad536bc73 100644 --- a/addons/base/static/test/form.js +++ b/addons/base/static/test/form.js @@ -1,32 +1,28 @@ $(document).ready(function () { - var widget; + var openerp; module("form.widget", { setup: function () { - var openerp = window.openerp.init(true); + openerp = window.openerp.init(true); window.openerp.base.chrome(openerp); // views loader stuff window.openerp.base.data(openerp); window.openerp.base.views(openerp); window.openerp.base.form(openerp); - widget = new openerp.base.form.Widget({ - 'widgets': {}, - 'fields': {} - }, { - 'attrs': {} - }); } }); test("compute_domain", function () { - widget.view.fields = { + var fields = { 'a': {value: 3}, 'group_method': {value: 'line'}, 'select1': {value: 'day'}, 'rrule_type': {value: 'monthly'} }; - ok(widget.compute_domain([['a', '=', 3]])); - ok(widget.compute_domain([['group_method','!=','count']])); - ok(widget.compute_domain([['select1','=','day'], - ['rrule_type','=','monthly']])); + ok(openerp.base.form.compute_domain( + [['a', '=', 3]], fields)); + ok(openerp.base.form.compute_domain( + [['group_method','!=','count']], fields)); + ok(openerp.base.form.compute_domain( + [['select1','=','day'], ['rrule_type','=','monthly']], fields)); }); test("compute_domain or", function () { var base = { @@ -39,16 +35,12 @@ $(document).ready(function () { '|', ['user_id','=',3], ['member_ids', 'in', [3]]]; - widget.view.fields = _.extend( - {}, base, {'section_id': {value: 42}}); - ok(widget.compute_domain(domain)); + ok(openerp.base.form.compute_domain(domain, _.extend( + {}, base, {'section_id': {value: 42}}))); + ok(openerp.base.form.compute_domain(domain, _.extend( + {}, base, {'user_id': {value: 3}}))); - widget.view.fields = _.extend( - {}, base, {'user_id': {value: 3}}); - ok(widget.compute_domain(domain)); - - widget.view.fields = _.extend( - {}, base, {'member_ids': {value: 3}}); - ok(widget.compute_domain(domain)); + ok(openerp.base.form.compute_domain(domain, _.extend( + {}, base, {'member_ids': {value: 3}}))); }); });