1
1
var d3 = require ( 'd3' ) ;
2
2
var _ = require ( 'lodash' ) ;
3
3
var moment = require ( 'moment' ) ;
4
+ var shared = require ( './shared' ) ;
4
5
var debug = require ( 'debug' ) ( 'scout-ui:minicharts:date' ) ;
5
6
var many = require ( './many' ) ;
6
7
8
+ require ( 'd3-tip' ) ( d3 ) ;
9
+
7
10
function generateDefaults ( n ) {
8
11
var doc = { } ;
9
- _ . each ( _ . range ( n ) , function ( d ) { doc [ d ] = 0 ; } ) ;
12
+ _ . each ( _ . range ( n ) , function ( d ) {
13
+ doc [ d ] = 0 ;
14
+ } ) ;
10
15
return doc ;
11
16
}
12
17
@@ -17,7 +22,7 @@ module.exports = function(opts) {
17
22
// distinguish ObjectIDs from real dates
18
23
if ( values . length && values [ 0 ] . _bsontype !== undefined ) {
19
24
if ( values [ 0 ] . _bsontype === 'ObjectID' ) {
20
- values = _ . map ( values , function ( v ) {
25
+ values = _ . map ( values , function ( v ) {
21
26
return v . getTimestamp ( ) ;
22
27
} ) ;
23
28
}
@@ -26,13 +31,7 @@ module.exports = function(opts) {
26
31
// A formatter for dates
27
32
var format = d3 . time . format ( '%Y-%m-%d %H:%M:%S' ) ;
28
33
29
- var margin = {
30
- top : 10 ,
31
- right : 0 ,
32
- bottom : 10 ,
33
- left : 0
34
- } ;
35
-
34
+ var margin = shared . margin ;
36
35
var width = opts . width - margin . left - margin . right ;
37
36
var height = opts . height - margin . top - margin . bottom ;
38
37
var el = opts . el ;
@@ -45,20 +44,20 @@ module.exports = function(opts) {
45
44
. range ( [ 0 , width ] ) ;
46
45
47
46
var upperBarBottom = height / 2 - 20 ;
48
- var upperRatio = 2 ;
47
+ var upperRatio = 2.5 ;
49
48
var upperMargin = 15 ;
50
49
51
50
// group by weekdays
52
- var weekdayLabels = [ 'Monday' , 'Tuesday' , 'Wednesday' , 'Thursday' , 'Friday' , 'Saturday' , 'Sunday' ] ;
51
+ var weekdayLabels = moment . weekdays ( ) ;
53
52
var weekdays = _ ( values )
54
- . groupBy ( function ( d ) {
53
+ . groupBy ( function ( d ) {
55
54
return moment ( d ) . weekday ( ) ;
56
55
} )
57
56
. defaults ( generateDefaults ( 7 ) )
58
- . map ( function ( d , i ) {
57
+ . map ( function ( d , i ) {
59
58
return {
60
- x : weekdayLabels [ i ] ,
61
- y : d . length ,
59
+ label : weekdayLabels [ i ] ,
60
+ value : d . length ,
62
61
tooltip : weekdayLabels [ i ]
63
62
} ;
64
63
} )
@@ -67,25 +66,35 @@ module.exports = function(opts) {
67
66
// group by hours
68
67
var hourLabels = d3 . range ( 24 ) ;
69
68
var hours = _ ( values )
70
- . groupBy ( function ( d ) {
69
+ . groupBy ( function ( d ) {
71
70
return d . getHours ( ) ;
72
71
} )
73
- . defaults ( generateDefaults ( 23 ) )
74
- . map ( function ( d , i ) {
72
+ . defaults ( generateDefaults ( 24 ) )
73
+ . map ( function ( d , i ) {
75
74
return {
76
- x : hourLabels [ i ] ,
77
- y : d . length ,
78
- tooltip : hourLabels [ i ] + 'h '
75
+ label : hourLabels [ i ] + ':00' ,
76
+ value : d . length ,
77
+ tooltip : hourLabels [ i ] + ':00 '
79
78
} ;
80
79
} )
81
80
. value ( ) ;
82
81
83
82
// clear element first
84
83
d3 . select ( el ) . selectAll ( '*' ) . remove ( ) ;
85
84
85
+ // set up tooltips
86
+ var tip = d3 . tip ( )
87
+ . attr ( 'class' , 'd3-tip' )
88
+ . html ( function ( d , i ) {
89
+ return format ( d ) ;
90
+ } )
91
+ . direction ( 'n' )
92
+ . offset ( [ - 9 , 0 ] ) ;
93
+
86
94
var svg = d3 . select ( el )
87
95
. append ( 'g' )
88
- . attr ( 'transform' , 'translate(' + margin . left + ',' + margin . top + ')' ) ;
96
+ . attr ( 'transform' , 'translate(' + margin . left + ',' + margin . top + ')' )
97
+ . call ( tip ) ;
89
98
90
99
var line = svg . selectAll ( '.line' )
91
100
. data ( values )
@@ -98,7 +107,9 @@ module.exports = function(opts) {
98
107
. attr ( 'x2' , function ( d ) {
99
108
return barcodeX ( d ) ;
100
109
} )
101
- . attr ( 'y2' , barcodeBottom ) ;
110
+ . attr ( 'y2' , barcodeBottom )
111
+ . on ( 'mouseover' , tip . show )
112
+ . on ( 'mouseout' , tip . hide ) ;
102
113
103
114
var text = svg . selectAll ( '.text' )
104
115
. data ( barcodeX . domain ( ) )
@@ -112,24 +123,36 @@ module.exports = function(opts) {
112
123
. attr ( 'text-anchor' , function ( d , i ) {
113
124
return i ? 'end' : 'start' ;
114
125
} )
115
- . text ( function ( d ) {
116
- return format ( d ) ;
126
+ . text ( function ( d , i ) {
127
+ if ( format ( barcodeX . domain ( ) [ 0 ] ) === format ( barcodeX . domain ( ) [ 1 ] ) ) {
128
+ if ( i === 0 ) {
129
+ return 'inserted: ' + format ( d ) ;
130
+ }
131
+ } else {
132
+ return ( i ? 'last: ' : 'first: ' ) + format ( d ) ;
133
+ }
117
134
} ) ;
118
135
119
136
var weekdayContainer = svg . append ( 'g' ) ;
120
- many ( weekdays , weekdayContainer , width / ( upperRatio + 1 ) - upperMargin , upperBarBottom , {
121
- 'text-anchor' : 'middle' ,
122
- 'text' : function ( d ) {
123
- return d . x [ 0 ] ;
137
+ many ( weekdays , weekdayContainer , width / ( upperRatio + 1 ) - upperMargin , upperBarBottom , {
138
+ bgbars : true ,
139
+ labels : {
140
+ 'text-anchor' : 'middle' ,
141
+ 'text' : function ( d ) {
142
+ return d . label [ 0 ] ;
143
+ }
124
144
}
125
145
} ) ;
126
146
127
147
var hourContainer = svg . append ( 'g' )
128
- . attr ( 'transform' , 'translate(' + ( width / ( upperRatio + 1 ) + upperMargin ) + ', 0)' ) ;
129
-
130
- many ( hours , hourContainer , width / ( upperRatio + 1 ) * upperRatio - upperMargin , upperBarBottom , {
131
- 'text' : function ( d , i ) {
132
- return ( i % 6 === 0 || i === 23 ) ? d . x : '' ;
148
+ . attr ( 'transform' , 'translate(' + ( width / ( upperRatio + 1 ) + upperMargin ) + ', 0)' ) ;
149
+
150
+ many ( hours , hourContainer , width / ( upperRatio + 1 ) * upperRatio - upperMargin , upperBarBottom , {
151
+ bgbars : true ,
152
+ labels : {
153
+ 'text' : function ( d , i ) {
154
+ return ( i % 6 === 0 || i === 23 ) ? d . label : '' ;
155
+ }
133
156
}
134
157
} ) ;
135
158
0 commit comments