156 lines
3.9 KiB
JavaScript
156 lines
3.9 KiB
JavaScript
var _ = require('underscore');
|
|
var BackboneAbortSync = require('../../util/backbone-abort-sync');
|
|
var Model = require('../../core/model');
|
|
var helper = require('../helpers/histogram-helper');
|
|
|
|
/**
|
|
* This model is used for getting the total amount of data
|
|
* from the histogram widget (without any filter).
|
|
*/
|
|
|
|
module.exports = Model.extend({
|
|
defaults: {
|
|
url: '',
|
|
data: [],
|
|
localTimezone: false,
|
|
localOffset: 0,
|
|
hasBeenFetched: false
|
|
},
|
|
|
|
url: function () {
|
|
var params = [];
|
|
var columnType = this.get('column_type');
|
|
var offset = this._getCurrentOffset();
|
|
var aggregation = this.get('aggregation') || 'auto';
|
|
|
|
params.push('no_filters=1');
|
|
|
|
if (columnType === 'number' && this.get('bins')) {
|
|
params.push('bins=' + this.get('bins'));
|
|
} else if (columnType === 'date') {
|
|
params.push('aggregation=' + aggregation);
|
|
if (_.isFinite(offset)) {
|
|
params.push('offset=' + offset);
|
|
}
|
|
}
|
|
|
|
if (this.get('apiKey')) {
|
|
params.push('api_key=' + this.get('apiKey'));
|
|
} else if (this.get('authToken')) {
|
|
var authToken = this.get('authToken');
|
|
if (authToken instanceof Array) {
|
|
_.each(authToken, function (token) {
|
|
params.push('auth_token[]=' + token);
|
|
});
|
|
} else {
|
|
params.push('auth_token=' + authToken);
|
|
}
|
|
}
|
|
|
|
// Start - End
|
|
var start = this.get('start');
|
|
var end = this.get('end');
|
|
if (_.isFinite(start) && _.isFinite(end)) {
|
|
params.push('start=' + start);
|
|
params.push('end=' + end);
|
|
}
|
|
|
|
return this.get('url') + '?' + params.join('&');
|
|
},
|
|
|
|
initialize: function () {
|
|
this.sync = BackboneAbortSync.bind(this);
|
|
this._initBinds();
|
|
},
|
|
|
|
_initBinds: function () {
|
|
this.on('change:url', function () {
|
|
this.refresh();
|
|
}, this);
|
|
|
|
this.on('change:aggregation change:offset', function () {
|
|
if (this.get('column_type') === 'date' && this.get('aggregation')) {
|
|
this.refresh();
|
|
}
|
|
}, this);
|
|
|
|
this.on('change:bins', function () {
|
|
if (this.get('column_type') === 'number') {
|
|
this.refresh();
|
|
}
|
|
}, this);
|
|
|
|
this.on('change:localTimezone', function () {
|
|
this.refresh();
|
|
}, this);
|
|
|
|
this.on('change:column', function () {
|
|
this.set('aggregation', 'auto', { silent: true });
|
|
});
|
|
|
|
this.on('sync', function () {
|
|
this.set('hasBeenFetched', true);
|
|
});
|
|
},
|
|
|
|
setUrl: function (url) {
|
|
if (!url) {
|
|
throw new Error('url not specified');
|
|
}
|
|
this.set('url', url);
|
|
},
|
|
|
|
setBins: function (bins) {
|
|
this.set('bins', bins, { silent: bins === void 0 });
|
|
},
|
|
|
|
getData: function () {
|
|
return this.get('data');
|
|
},
|
|
|
|
parse: function (data) {
|
|
var aggregation = data.aggregation || this.get('aggregation');
|
|
var numberOfBins = data.bins_count || 0;
|
|
var width = data.bin_width;
|
|
var start = this.get('column_type') === 'date' ? data.timestamp_start : data.bins_start;
|
|
|
|
var parsedData = {};
|
|
parsedData.data = new Array(numberOfBins);
|
|
|
|
if (aggregation) {
|
|
parsedData.aggregation = aggregation;
|
|
this.set('aggregation', aggregation, { silent: true });
|
|
}
|
|
|
|
_.each(data.bins, function (bin) {
|
|
parsedData.data[bin.bin] = bin;
|
|
});
|
|
|
|
if (this.get('column_type') === 'date') {
|
|
parsedData.data = helper.fillTimestampBuckets(parsedData.data, start, aggregation, numberOfBins, 'totals');
|
|
numberOfBins = parsedData.data.length;
|
|
} else {
|
|
helper.fillNumericBuckets(parsedData.data, start, width, numberOfBins);
|
|
}
|
|
|
|
if (parsedData.data.length > 0) {
|
|
parsedData.start = parsedData.data[0].start;
|
|
parsedData.end = parsedData.data[parsedData.data.length - 1].end;
|
|
}
|
|
|
|
parsedData.bins = numberOfBins;
|
|
|
|
return parsedData;
|
|
},
|
|
|
|
refresh: function () {
|
|
this.fetch();
|
|
},
|
|
|
|
_getCurrentOffset: function () {
|
|
return this.get('localTimezone')
|
|
? this.get('localOffset')
|
|
: this.get('offset');
|
|
}
|
|
});
|