openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #00072
[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