4831: Rearrange classes more.
[arvados.git] / apps / backstage / app / component.dmgraph.js
1 module.exports = DataManagerGraph;
2
3 var _ = require('lodash');
4 var m = require('mithril');
5 // var Morris = require('morrisjs'); /* It's currently a global. */
6
7 function DataManagerGraph() {};
8 DataManagerGraph.controller = function(opts) {
9     opts.connection.api('Log', 'list', {
10         filters: [['event_type', '=', 'experimental-data-manager-report']],
11         order: ['created_at DESC'],
12     }).then(this.logs = m.prop([])).then(m.redraw);
13     this.configGraph = function configGraph(element, isInitialized, context) {
14         var seriesLabel = {};
15         var data = _.compact(this.logs().map(function(item){
16             try {
17                 var p = item.properties;
18                 var runId = '' + p.run_info.pid + '/' + p.run_info.start_time;
19                 var pt = {
20                     seriesLabel: '' + p.run_info.pid,
21                     collectionsRead: p.collection_info.collections_read,
22                     logCreatedAt: toDate(item.created_at),
23                     runStartTime: toDate(p.run_info.start_time),
24                 };
25                 pt[runId] = pt.collectionsRead;
26                 seriesLabel[runId] = p.run_info.pid;
27                 return pt;
28             } catch(e) {
29                 return null;
30             }
31         }));
32         var chartopts = {
33             element: element,
34             hoverCallback: morrisHoverCallback,
35             xkey: 'logCreatedAt',
36             ykeys: _.keys(seriesLabel),
37             labels: _.values(seriesLabel),
38             resize: true,
39         };
40         if (!isInitialized || !_.isEqual(chartopts, context.chartopts)) {
41             context.chartopts = chartopts;
42             context.chart = new Morris.Line(_.merge({data:data}, chartopts));
43         } else if (!context.chart) {
44             // Initialization crashed, no chart?
45         } else if (!_.isEqual(data, context.data)) {
46             context.chart.setData(data);
47         }
48         context.data = data;
49     }.bind(this);
50     function toDate(timestamp) {
51         // 2015-01-13T01:13:52.281556508Z -> 2015-01-13 01:13:52.281
52         return timestamp.match(/([-\d]{10})T([:\.\d]{8,12})/).slice(1).join(' ');
53     }
54     function morrisHoverCallback(index, options, content, row) {
55         return ''+row.seriesLabel+': '+row.collectionsRead+' collections read @ '+row.logCreatedAt;
56     }
57 };
58 DataManagerGraph.view = function(ctrl) {
59     return ctrl.logs().length==0 ? [] : m('div', {
60         config: ctrl.configGraph,
61         style: { width: '100%', height: 200 },
62     });
63 };