[filter,refactor][s]: remove fieldType attribute on filters as can (and should) get fieldType from model if needed.
* fieldType is needed now as we parse values to specific type before doing filters * needed to correct some tests for this change
This commit is contained in:
@@ -24,7 +24,7 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
||||
} else {
|
||||
if (data) {
|
||||
this.fields = _.map(data[0], function(value, key) {
|
||||
return {id: key};
|
||||
return {id: key, type: 'string'};
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -99,10 +99,20 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
||||
geo_distance : geo_distance
|
||||
};
|
||||
var dataParsers = {
|
||||
number : function (e) { return parseFloat(e, 10); },
|
||||
integer: function (e) { return parseFloat(e, 10); },
|
||||
'float': function (e) { return parseFloat(e, 10); },
|
||||
string : function (e) { return e.toString() },
|
||||
date : function (e) { return new Date(e).valueOf() }
|
||||
date : function (e) { return new Date(e).valueOf() },
|
||||
datetime : function (e) { return new Date(e).valueOf() }
|
||||
};
|
||||
var keyedFields = {};
|
||||
_.each(self.fields, function(field) {
|
||||
keyedFields[field.id] = field;
|
||||
});
|
||||
function getDataParser(filter) {
|
||||
var fieldType = keyedFields[filter.field].type || 'string';
|
||||
return dataParsers[fieldType];
|
||||
}
|
||||
|
||||
// filter records
|
||||
return _.filter(results, function (record) {
|
||||
@@ -115,9 +125,8 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
||||
});
|
||||
|
||||
// filters definitions
|
||||
|
||||
function term(record, filter) {
|
||||
var parse = dataParsers[filter.fieldType];
|
||||
var parse = getDataParser(filter);
|
||||
var value = parse(record[filter.field]);
|
||||
var term = parse(filter.term);
|
||||
|
||||
@@ -125,7 +134,7 @@ this.recline.Backend.Memory = this.recline.Backend.Memory || {};
|
||||
}
|
||||
|
||||
function range(record, filter) {
|
||||
var parse = dataParsers[filter.fieldType];
|
||||
var parse = getDataParser(filter);
|
||||
var value = parse(record[filter.field]);
|
||||
var start = parse(filter.start);
|
||||
var stop = parse(filter.stop);
|
||||
|
||||
@@ -470,16 +470,15 @@ my.Query = Backbone.Model.extend({
|
||||
}
|
||||
}
|
||||
},
|
||||
// ### addFilter
|
||||
// ### addFilter(filter)
|
||||
//
|
||||
// Add a new filter (appended to the list of filters)
|
||||
// Add a new filter specified by the filter hash and append to the list of filters
|
||||
//
|
||||
// @param filter an object specifying the filter - see _filterTemplates for examples. If only type is provided will generate a filter by cloning _filterTemplates
|
||||
addFilter: function(filter) {
|
||||
// crude deep copy
|
||||
var ourfilter = JSON.parse(JSON.stringify(filter));
|
||||
// not full specified so use template and over-write
|
||||
// 3 as for 'type', 'field' and 'fieldType'
|
||||
// not fully specified so use template and over-write
|
||||
if (_.keys(filter).length <= 3) {
|
||||
ourfilter = _.extend(this._filterTemplates[filter.type], ourfilter);
|
||||
}
|
||||
|
||||
@@ -122,8 +122,7 @@ my.FilterEditor = Backbone.View.extend({
|
||||
$target.hide();
|
||||
var filterType = $target.find('select.filterType').val();
|
||||
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});
|
||||
this.model.queryState.addFilter({type: filterType, field: field});
|
||||
// trigger render explicitly as queryState change will not be triggered (as blank value for filter)
|
||||
this.render();
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user