diff --git a/addons/website_crm_score/static/src/js/display_filters.js b/addons/website_crm_score/static/src/js/display_filters.js new file mode 100644 index 00000000000..020b7d7d46c --- /dev/null +++ b/addons/website_crm_score/static/src/js/display_filters.js @@ -0,0 +1,90 @@ +openerp.website_crm_score = function(instance) { + var _t = instance.web._t, + _lt = instance.web._lt; + var QWeb = instance.web.qweb; + + instance.website_crm_score = {}; + + instance.website_crm_score.filters = instance.web_kanban.AbstractField.extend({ + /** + bnf grammar of a filter: + ::= + ::= | '!' | + ::= '&' | '|' + ::= '(' ',' ',' ')' + ::= '=' | '!=' | '<=' | '<' | '>' | '>=' | '=?' | + '=like' | '=ilike' | 'like' | 'not like' | + 'ilike' | 'not ilike' | 'in' | 'not in' | 'child_of' + some operators are negative + */ + NEG_OP: ['!=', 'not like', 'not ilike', 'not in'], + MAX_LEN: 5, + start: function() { + var val = this.field.raw_value; + var self = this; + if (val) { + val = eval(val); + if (val.length <= this.MAX_LEN) { + var i = 0; + while (i < val.length) { + var res = this.interpret(val, i); + i = res[0]; + var $span = res[1]; + // var $span = '

' + res[1] + '

'; + self.$el.append($span); + } + } + else { + var $span = 'Domain too big'; + self.$el.append($span); + } + } + }, + + interpret: function(val, i) { + var a = val[i]; + if(typeof a !== 'string'){ + // a is a tuple (field, op, value) + var tag = a[0]; // field name + var tip = a[2]; // field value + if (this.NEG_OP.indexOf(a[1]) !== -1){ + // op in NEG_OP + tip = 'not ' + tip; + } + var span = ''+ tag +''; + return [i+1, span]; + } + else if (a === '!'){ + var res = this.interpret(val, i+1); + var span = '!' + res[1]; + return [res[0], span]; + } + else { + // binary operator + var res = this.binary_operator(val, i); + return res; + } + return [i+1, '']; + }, + + binary_operator: function(val, i) { + var resA = this.interpret(val, i+1); + var resB = this.interpret(val, resA[0]); + var label = ''; + var op = ''; + if (val[i] === '|') { + label = 'label-success'; + op = ' or '; + } + else if (val[i] === '&') { + label = 'label-primary'; + op = ' and '; + } + var span = resA[1] + resB[1]; + return [resB[0], span]; + } + }); + + instance.web_kanban.fields_registry.add('filters', 'instance.website_crm_score.filters'); + +}