(function () { var isoFormat = 'YYYY-MM-DDTHH:mm:ss'; function DlLineChartDirective($timeout, DillerClient) { var id_seq = 0; return { restrict: 'E', scope: { device: '=', property: '=', value: '=', interval: '=' }, replace: true, templateUrl: 'app/templates/line-chart.html', link: function (scope, element, attrs) { var elementId = element.attr('id'); if (!elementId) { elementId = 'dl-line-chart-' + id_seq++; element.attr('id', elementId); } var deviceId = scope.device; var propertyId = scope.property; var interval = scope.interval; // TODO: watch scope.interval var property = DillerClient.getDevice(deviceId).getProperty(propertyId); var chart, chartData; var options = { axisX: { showLabel: true, showGrid: true, labelInterval: 1, labelInterpolationFnc: function (value, index) { return index % options.labelInterval === 0 ? value.format('HH:mm') : null; } } }; function refresh() { property.getInterval(interval).then(function (data) { var avgs = _.pluck(data.values, 'avg'); var timestamps = _.map(data.values, function (row) { return moment(row.timestamp, isoFormat); }); chartData = { labels: timestamps, series: [ avgs ] }; options.labelInterval = Math.round(data.values.length / 10); if (!chart) { chart = new Chartist.Line('#' + elementId + ' .chart', chartData, options); } else { chart.update(chartData); } }); } scope.setInterval = function (amount, type) { if (type == 'hours') { interval = Diller.Interval.hours(amount); } else if (type == 'days') { interval = Diller.Interval.days(amount); } else if (type == 'months') { interval = Diller.Interval.months(amount); } interval && refresh(); }; interval && refresh(); } }; } angular .module('diller.line-chart', ['diller.client']) .directive('dlLineChart', DlLineChartDirective); })();