[#248,model][s]: normalize Field types where possible by mapping standard type aliases to default type name - fixes #248.
* view.graph.js improve graph view by making sure datetime for an axis is judged by whether it is date, datetime or time not just date! * backend.ckan.js some type conversions now done in core model so can be removed
This commit is contained in:
@@ -118,12 +118,12 @@ The type list is as follows (brackets indicate
|
|||||||
possible aliases for specific types - these types will be recognized and
|
possible aliases for specific types - these types will be recognized and
|
||||||
normalized to the default type name for that type):
|
normalized to the default type name for that type):
|
||||||
|
|
||||||
* string (text)
|
* string (text) - a string
|
||||||
* number (double, float) - a number including floating point numbers.
|
* number (double, float, numeric) - a number including floating point numbers.
|
||||||
* integer (int) - an integer.
|
* integer (int) - an integer.
|
||||||
* date - a date. The preferred format is YYYY-MM-DD.
|
* date - a date. The preferred format is YYYY-MM-DD.
|
||||||
* time - a time without a date
|
* time - a time without a date
|
||||||
* date-time (dateTime, timestamp) a date-time. It is recommended this be in ISO 8601
|
* date-time (datetime, timestamp) a date-time. It is recommended this be in ISO 8601
|
||||||
format of YYYY-MM- DDThh:mm:ssZ in UTC time.
|
format of YYYY-MM- DDThh:mm:ssZ in UTC time.
|
||||||
* boolean (bool)
|
* boolean (bool)
|
||||||
* binary - base64 representation of binary data.
|
* binary - base64 representation of binary data.
|
||||||
|
|||||||
@@ -94,10 +94,7 @@ this.recline.Backend.Ckan = this.recline.Backend.Ckan || {};
|
|||||||
var CKAN_TYPES_MAP = {
|
var CKAN_TYPES_MAP = {
|
||||||
'int4': 'integer',
|
'int4': 'integer',
|
||||||
'int8': 'integer',
|
'int8': 'integer',
|
||||||
'float8': 'float',
|
'float8': 'float'
|
||||||
'text': 'string',
|
|
||||||
'json': 'object',
|
|
||||||
'timestamp': 'date'
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}(jQuery, this.recline.Backend.Ckan));
|
}(jQuery, this.recline.Backend.Ckan));
|
||||||
|
|||||||
16
src/model.js
16
src/model.js
@@ -380,6 +380,9 @@ my.Field = Backbone.Model.extend({
|
|||||||
if (this.attributes.label === null) {
|
if (this.attributes.label === null) {
|
||||||
this.set({label: this.id});
|
this.set({label: this.id});
|
||||||
}
|
}
|
||||||
|
if (this.attributes.type.toLowerCase() in this._typeMap) {
|
||||||
|
this.attributes.type = this._typeMap[this.attributes.type.toLowerCase()];
|
||||||
|
}
|
||||||
if (options) {
|
if (options) {
|
||||||
this.renderer = options.renderer;
|
this.renderer = options.renderer;
|
||||||
this.deriver = options.deriver;
|
this.deriver = options.deriver;
|
||||||
@@ -389,6 +392,17 @@ my.Field = Backbone.Model.extend({
|
|||||||
}
|
}
|
||||||
this.facets = new my.FacetList();
|
this.facets = new my.FacetList();
|
||||||
},
|
},
|
||||||
|
_typeMap: {
|
||||||
|
'text': 'string',
|
||||||
|
'double': 'number',
|
||||||
|
'float': 'number',
|
||||||
|
'numeric': 'number',
|
||||||
|
'int': 'integer',
|
||||||
|
'datetime': 'date-time',
|
||||||
|
'bool': 'boolean',
|
||||||
|
'timestamp': 'date-time',
|
||||||
|
'json': 'object'
|
||||||
|
},
|
||||||
defaultRenderers: {
|
defaultRenderers: {
|
||||||
object: function(val, field, doc) {
|
object: function(val, field, doc) {
|
||||||
return JSON.stringify(val);
|
return JSON.stringify(val);
|
||||||
@@ -396,7 +410,7 @@ my.Field = Backbone.Model.extend({
|
|||||||
geo_point: function(val, field, doc) {
|
geo_point: function(val, field, doc) {
|
||||||
return JSON.stringify(val);
|
return JSON.stringify(val);
|
||||||
},
|
},
|
||||||
'float': function(val, field, doc) {
|
'number': function(val, field, doc) {
|
||||||
var format = field.get('format');
|
var format = field.get('format');
|
||||||
if (format === 'percentage') {
|
if (format === 'percentage') {
|
||||||
return val + '%';
|
return val + '%';
|
||||||
|
|||||||
@@ -145,7 +145,8 @@ my.Graph = Backbone.View.extend({
|
|||||||
var xfield = self.model.fields.get(self.state.attributes.group);
|
var xfield = self.model.fields.get(self.state.attributes.group);
|
||||||
|
|
||||||
// time series
|
// time series
|
||||||
var isDateTime = xfield.get('type') === 'date';
|
var xtype = xfield.get('type');
|
||||||
|
var isDateTime = (xtype === 'date' || xtype === 'date-time' || xtype === 'time');
|
||||||
|
|
||||||
if (self.model.records.models[parseInt(x)]) {
|
if (self.model.records.models[parseInt(x)]) {
|
||||||
x = self.model.records.models[parseInt(x)].get(self.state.attributes.group);
|
x = self.model.records.models[parseInt(x)].get(self.state.attributes.group);
|
||||||
@@ -259,7 +260,8 @@ my.Graph = Backbone.View.extend({
|
|||||||
var x = doc.getFieldValue(xfield);
|
var x = doc.getFieldValue(xfield);
|
||||||
|
|
||||||
// time series
|
// time series
|
||||||
var isDateTime = xfield.get('type') === 'date';
|
var xtype = xfield.get('type');
|
||||||
|
var isDateTime = (xtype === 'date' || xtype === 'date-time' || xtype === 'time');
|
||||||
|
|
||||||
if (isDateTime) {
|
if (isDateTime) {
|
||||||
// datetime
|
// datetime
|
||||||
|
|||||||
@@ -38,6 +38,28 @@ test('Field: basics', function () {
|
|||||||
equal('XX', out[0].label);
|
equal('XX', out[0].label);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Field: type mapping', function () {
|
||||||
|
var tests = [
|
||||||
|
{ input: 'text', exp: 'string'},
|
||||||
|
{ input: 'int', exp: 'integer'},
|
||||||
|
{ input: 'float', exp: 'number'},
|
||||||
|
{ input: 'double', exp: 'number'},
|
||||||
|
{ input: 'datetime', exp: 'date-time'},
|
||||||
|
{ input: 'dateTime', exp: 'date-time'},
|
||||||
|
{ input: 'bool', exp: 'boolean'},
|
||||||
|
{ input: 'timestamp', exp: 'date-time'},
|
||||||
|
{ input: 'json', exp: 'object'}
|
||||||
|
];
|
||||||
|
|
||||||
|
_.each(tests, function(data) {
|
||||||
|
var field = new recline.Model.Field({
|
||||||
|
id: 'x',
|
||||||
|
type: data.input
|
||||||
|
});
|
||||||
|
equal(field.get('type'), data.exp);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test('Field: default renderers', function () {
|
test('Field: default renderers', function () {
|
||||||
var doc = new recline.Model.Record({
|
var doc = new recline.Model.Record({
|
||||||
x: 12.3,
|
x: 12.3,
|
||||||
|
|||||||
Reference in New Issue
Block a user