[IMP] website_crm_score: add a first version for widget filter - need improvments

This commit is contained in:
Jeremy Kersten
2015-01-21 15:23:45 +01:00
parent 59d6ce7b30
commit 656993edb3
@@ -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:
<filter> ::= <expr>
<expr> ::= <tuple> | '!' <expr> | <bin_op> <expr> <expr>
<bin_op> ::= '&' | '|'
<tuple> ::= '(' <field_name> ',' <operator> ',' <field_value> ')'
<operator> ::= '=' | '!=' | '<=' | '<' | '>' | '>=' | '=?' |
'=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 = '<h2>' + res[1] + '</h2>';
self.$el.append($span);
}
}
else {
var $span = '<span class="oe_tag" style="background-color:#fce9e9;">Domain too big<span>';
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 = '<span class="oe_tag" title="' + tip + '">'+ tag +'</span>';
return [i+1, span];
}
else if (a === '!'){
var res = this.interpret(val, i+1);
var span = '<span class="oe_tag">!</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');
}