← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev-web/openobject-client-web/filters-fix into lp:~openerp-dev/openobject-client-web/trunk-dev-web

 

Xavier (Open ERP) has proposed merging lp:~openerp-dev-web/openobject-client-web/filters-fix into lp:~openerp-dev/openobject-client-web/trunk-dev-web.

Requested reviews:
  sma (Open ERP) (sma-tiny)
  noz (Open ERP) (noz-tiny)


Fix of the "custom" filters (the one hidden by the [+] button) which were broken by previous modifications (probably mine), could you check that it works correctly and I haven't broken anything else (or forgotten any behavior which should have been implemented)?
-- 
https://code.launchpad.net/~openerp-dev-web/openobject-client-web/filters-fix/+merge/30245
Your team OpenERP SA's Web Client R&D is subscribed to branch lp:~openerp-dev/openobject-client-web/trunk-dev-web.
=== modified file 'addons/openerp/static/javascript/search.js'
--- addons/openerp/static/javascript/search.js	2010-07-16 06:07:52 +0000
+++ addons/openerp/static/javascript/search.js	2010-07-19 09:55:56 +0000
@@ -30,13 +30,6 @@
  *  @target #filter_table the element holding the filter rows
  *  @argument 'the newly added (or showed for first row?) filter row'
  */
-function reset_id(element, current_row_id) {
-    element = jQuery(element);
-    return element.attr('id', element.attr('id').split('/')[0] + '/' + current_row_id);
-}
-function row_sequence(element) {
-    return parseInt(element.attr('id').split('/')[1], 10);
-}
 function add_filter_row() {
     var filter_table = jQuery('#filter_table');
     var vals = ['AND', 'OR'];
@@ -48,21 +41,12 @@
         old_tr.find('input.qstring').css('background', '#FFF');
 
         var new_tr = old_tr.clone();
-        var old_sequence = row_sequence(new_tr);
-        // create id for new row
-        var current_row_sequence = old_sequence + 1;
-        reset_id(new_tr, current_row_sequence);
 
         var qstring = new_tr.find('input.qstring').css('background', '#fff').val('');
-        jQuery('td.filter_column, select.filter_fields, select.expr, td.image_col', new_tr).add(qstring).each(
-                function (index, element) {
-                    reset_id(element, current_row_sequence);
-                });
 
-        var and_or = jQuery('<td>', {'id': 'and_or/' + old_sequence, 'class': 'and_or'}).appendTo(old_tr);
+        var and_or = jQuery('<td>', {'class': 'and_or'}).appendTo(old_tr);
 
         var select_andor = jQuery('<select>', {
-            'id': 'select_andor/' + old_sequence,
             'class': 'select_andor'
         }).appendTo(and_or);
         jQuery.each(vals, function (index, label) {
@@ -80,99 +64,106 @@
 function remove_filter_row(element) {
     var node = jQuery(element).closest('tr');
     if(node.is(':only-child')) {
-        node.find('[id^=qstring]').css('background', '#FFF').val('');
+        node.find('input.qstring').css('background', '#FFF').val('');
         jQuery('#filter_table').hide();
     } else {
         if(node.is(':last-child')) {
-            node.prev().find('[id^=and_or]').remove();
+            node.prev().find('.and_or').remove();
         }
         node.remove();
     }
 }
 
-function display_Customfilters(all_domains, group_by_ctx){
-
-    var params = {};
-	var record = {};
-
-    jQuery('#filter_table tr.filter_row_class').each(function () {
-		var ids = this.id;	// row id...
-		var id = ids.split('/')[1];
-		var qid = 'qstring/' + id;
-		var fid = 'filter_fields/' + id;
-
-        var rec = null;
-		if ($(qid) && $(qid).value) {
-			rec = {};
-			rec[$(fid).value] = $(qid).value;
-			params['_terp_model'] = openobject.dom.get('_terp_model').value;
-		}
-		if (rec) {
-			record[ids] = rec;
-		}
-	});
-	
-	record = serializeJSON(record);
-	params['record'] = record;
-	var custom_domain = [];
-	var search_req = openobject.http.postJSON('/openerp/search/get', params);
-	search_req.addCallback(function(obj){
-		if (obj.error) {
-			forEach(children, function(child){
-				var cids = child['id'];
-				var id = cids.split('/')[1];
-				var fid = 'filter_fields/' + id;
-				if ($(fid).value == obj.error_field) {
-					f = fid.split('/')[1];
-					$('qstring/'+f).style.background = '#FF6666';
-					$('qstring/'+f).value = obj.error;
-				}
-			});
-		}
-		if (obj.frm) {
-   			for (var i in obj.frm) {
-   				var temp_domain = [];
-   				var operator = 'None';
-   				
-				var id = serializeJSON(i).split('/')[1];
-				id = parseInt(id, 10);
-				
-				var fid = 'filter_fields/' + id;
-				var eid = 'expr/' + id;
-				var select_andor = 'select_andor/' + id;
-				var type = obj.frm[i].type;
-				
-				if($(select_andor)){
-					var operator = $(select_andor).value == 'AND'? '&': '|';
-				}
-				  				
-   				if (operator != 'None') {
-   					temp_domain.push(operator);
-   				}
-   				
-   				var first_text = obj.frm[i].rec;
-   				var expression = $(eid).value;
-   				var right_text = obj.frm[i].rec_val;
-   				
-   				if (expression=='ilike'||expression=='not ilike'){
-   					if (type=='integer'||type=='float'||type=='date'||type=='datetime'||type=='boolean'){
-   						expression = expression == 'ilike'? '=': '!=';
-   					}
-   				}
-   				if ((expression == '<' || expression == '>') && (type!='integer'||type!='float'||type!='date'||type!='datetime'||type!='boolean')){
-   					expression = '=';
-   				}
-   				if (expression == 'in' || expression == 'not in'){
-   					right_text = typeof right_text == 'string'? right_text.split(',') : right_text[right_text.length-1][right_text[right_text.length-1].length-1];
-   				}
-   				
-				temp_domain.push(first_text, expression, right_text);
-				custom_domain.push(temp_domain);
-   			}
-		}
-		custom_domain = serializeJSON(custom_domain);
-		final_search_domain(custom_domain, all_domains, group_by_ctx);
-	});	
+/**
+ * Checks if a type is considered order-able, so that we can setup the right search operators for the operand
+ * @param type the field's type to consider for operator replacement
+ */
+function isOrderable(type) {
+    return jQuery.inArray(type, ['integer', 'float', 'date', 'datetime', 'boolean']) != -1;
+}
+function display_Customfilters(all_domains, group_by_ctx) {
+    var record = {};
+
+    var children = jQuery('#filter_table tr.filter_row_class');
+    children.each(function () {
+        var $constraint_value = jQuery(this).find('input.qstring');
+        var $fieldname = jQuery(this).find('select.filter_fields');
+
+        var id = jQuery(this).parent().find('> .filter_row_class').index(this);
+
+        if($constraint_value.val()) {
+            var rec = {};
+            rec[$fieldname.val()] = $constraint_value.val();
+            record[id] = rec;
+        }
+    });
+
+    openobject.http.postJSON('/openerp/search/get', {
+        record: serializeJSON(record),
+        _terp_model: jQuery('#_terp_model').val()
+    }).addCallback(function(obj) {
+        var custom_domain = [];
+        if(obj.error) {
+            children.each(function () {
+                if(jQuery(this).find('select.filter_fields').val() == obj['error_field']) {
+                    jQuery(this).find('input.qstring').css('background', '#f66').val(obj.error);
+                }
+            });
+        }
+        var form_result = obj.frm;
+        if(form_result) {
+            // By property, we get incorrect ordering
+            for(var index = 0; ; ++index) {
+                if(!(index in form_result)) { break; }
+
+                var return_record = form_result[index];
+                var temp_domain = [];
+
+                var $row = jQuery('tr.filter_row_class').eq(index);
+
+                var type = return_record.type;
+
+                var grouping = $row.find('select.select_andor').val();
+                if(grouping) {
+                    temp_domain.push(grouping == 'AND' ? '&' : '|');
+                }
+
+                var field = return_record['rec'];
+                var comparison = $row.find('select.expr').val();
+                var value = return_record['rec_val'];
+
+                switch (comparison) {
+                    case 'ilike':
+                    case 'not ilike':
+                        if(isOrderable(type)) {
+                            comparison = (comparison == 'ilike' ? '=' : '!=');
+                        }
+                        break;
+                    case '<':
+                    case '>':
+                        if(!isOrderable(type)) {
+                            comparison = '=';
+                        }
+                        break;
+                    case 'in':
+                    case 'not in':
+                        if(typeof value == 'string') {
+                            value = value.split(',');
+                        } else {
+                            /* very weird array-type construct
+                               looks a bit like [[6, 0, [list of ids here]]]
+                             */
+                            value = value[value.length - 1][value[value.length - 1].length - 1]
+                        }
+                        break;
+                }
+
+                temp_domain.push(field, comparison, value);
+                custom_domain.push(temp_domain);
+            }
+        }
+        final_search_domain(serializeJSON(custom_domain), all_domains, group_by_ctx);
+    });
 }
 
 var group_by = new Array();

=== modified file 'addons/openerp/widgets/templates/search.mako'
--- addons/openerp/widgets/templates/search.mako	2010-07-12 14:40:51 +0000
+++ addons/openerp/widgets/templates/search.mako	2010-07-19 09:55:56 +0000
@@ -1,31 +1,30 @@
 <div id="search_filter_data">
 	${display_member(frame)}
 	<table id="filter_table" style="display: none;">
-		<% x = 0 %>
 		% for f,k in enumerate(filter_domain):
 			% if len(k) >1:
-			    <tr id="filter_row/${x}" class="filter_row_class">
-                    <td id="image_col/${x}" class="image_col">
+			    <tr class="filter_row_class">
+                    <td class="image_col">
                         <button onclick="remove_filter_row(this); return false;">
                             <img alt="Remove filter row" src="/openerp/static/images/button-b-icons-remove.gif"/>
                         </button>
                     </td>
-					<td align="right" class="filter_column" id="filter_column/${x}">
-						<select id="filter_fields/${x}" class="filter_fields">
+					<td align="right" class="filter_column">
+						<select class="filter_fields">
 							% for field in fields_list:
 								<option kind="${field[2]}" value="${field[0]}" ${py.selector(field[0]==k[0])}>${field[1]}</option>
 							% endfor
 					       </select>
-						<select id="expr/${x}" class="expr">
+						<select class="expr">
 							% for operator, description in operators_map:
 								<option value="${operator}" ${py.selector(operator==k[1])}>${description}</option>
 							% endfor
 						</select>
-					       <input type="text" class='qstring' id="qstring/${x}" value="${k[2] or ''}" />
+					       <input type="text" class='qstring' value="${k[2] or ''}" />
 					</td>
 					% if len(filter_domain[f -1]) == 1:
-					<td class="and_or" id="and_or/${x}">
-						<select id="select_andor/${x}" class="select_andor">
+					<td class="and_or">
+						<select class="select_andor">
 						% if filter_domain[f-1] == '&':
 							<option value="AND">AND</option>
 						%else:
@@ -35,7 +34,6 @@
 					</td>
 					% endif
 			    </tr>
-			    <% x = x+1 %>
 			% endif
 		% endfor
 	</table>


Follow ups