[#96,closed] Range filter with support for string, number and date data-types

This commit is contained in:
Krzysztof Trzewiczek
2012-08-09 13:00:41 +02:00
parent b39f858f69
commit d7fc9ba1f8
4 changed files with 64 additions and 26 deletions

View File

@@ -97,6 +97,11 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
range : range,
geo_distance : geo_distance
};
var dataParsers = {
number : function (e) { return parseFloat(e, 10); },
string : function (e) { return e.toString() },
date : function (e) { return new Date(e).valueOf() }
};
// filter records
return _.filter(results, function (record) {
@@ -111,15 +116,18 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
// filters definitions
function term(record, filter) {
return (record[filter.field] === filter.term);
var parse = dataParsers[filter.fieldType];
var value = parse(record[filter.field]);
var term = parse(filter.term);
return (value === term);
}
function range(record, filter) {
// TODO handle different data types correctly
var number = !isNaN(parseFloat(filter.start, 10));
var start = number ? parseFloat(filter.start, 10) : filter.start;
var stop = number ? parseFloat(filter.stop, 10) : filter.stop;
var value = number ? parseFloat(record[filter.field]) : record[filter.field];
var parse = dataParsers[filter.fieldType];
var value = parse(record[filter.field]);
var start = parse(filter.start);
var stop = parse(filter.stop);
return (value >= start && value <= stop);
}

View File

@@ -505,6 +505,7 @@ my.Query = Backbone.Model.extend({
stop: ''
},
geo_distance: {
type: 'geo_distance',
distance: 10,
unit: 'km',
point: {

View File

@@ -121,8 +121,9 @@ my.FilterEditor = Backbone.View.extend({
var $target = $(e.target);
$target.hide();
var filterType = $target.find('select.filterType').val();
var field = $target.find('select.fields').val();
this.model.queryState.addFilter({type: filterType, field: field});
var field = $target.find('select.fields').val();
var fieldType = this.model.fields.find(function (e) { return e.get('id') === field }).get('type');
this.model.queryState.addFilter({type: filterType, field: field, fieldType: fieldType});
// trigger render explicitly as queryState change will not be triggered (as blank value for filter)
this.render();
},