Home Reference Source Repository

js/chart/timeserie.js

/**
 * An helper module to parse and fix metrics as time series
 */
define(['jquery', 'moment', 'logger'], function($, moment, logger) {

    var LEVELS = {
        daily: {
            key: 'YYYY-MM-DD',
            short: 'L',
            add: function(value, days) {
                return value.add(days, 'days')
            }
        },
        monthly: {
            key: 'YYYY-MM',
            short: 'MMM. YYYY',
            add: function(value, months) {
                return value.add(months, 'months')
            }
        }
    };

    function TimeSerie(data, level) {
        level = level || 'daily';

        if (!LEVELS.hasOwnProperty(level)) {
            throw new TypeError('Unknown level "'+ level +'"');
        }

        this.level = LEVELS[level];
        this.data = data;
    };

    TimeSerie.LEVELS = LEVELS;


    TimeSerie.extract = function (data, name, level) {
        var extracted = $.map(data, function(row, idx) {
                return {
                    date: row.date,
                    value: row.values[name]
                }
            });

        return new TimeSerie(extracted, level);
    };

    TimeSerie.prototype = {

        constructor: TimeSerie,

        getLasts: function(nb, default_value) {
            var lasts = [],
                today = moment(),
                first = this.level.add(today.clone(), -nb),
                previous;

            default_value = default_value || 0;

            for (var i=0; i <= nb; i++) {
                var date = this.level.add(first.clone(), i),
                    key = date.format(this.level.key),
                    row = {
                        date: key,
                        label: date.format(this.level.short),
                        value: previous ? previous.value : default_value
                    },
                    match = $.grep(this.data, function(row, idx) {
                        return row.date == key;
                    });


                if (match.length) {
                    row.value = match['0'].value || row.value;
                };

                lasts.push(row);
                previous = row;
            }

            return lasts;
        }
    };

    return TimeSerie;

});