@@ -5,39 +5,66 @@ function createGraph(combiData, plainData, singleDayData, canvas){
55 * The function should return the ChartJS object.
66 */
77
8- var allCategories = [ ]
8+ function getLabelFromTimestamp ( t ) {
9+ let date = new Date ( t * 1000 ) ;
10+ let day = ( date . getDate ( ) > 9 ? '' : '0' ) + date . getDate ( ) ;
11+ let month = ( date . getMonth ( ) + 1 > 9 ? '' : '0' ) + ( date . getMonth ( ) + 1 ) ;
12+
13+ return `${ day } .${ month } .${ date . getFullYear ( ) } ` ;
14+ }
15+
16+ // get time span and all categories
17+ var minDate = Number . MAX_SAFE_INTEGER ;
18+ var maxDate = Number . MIN_SAFE_INTEGER ;
19+ var allCategories = { }
20+ var allNames = { }
921 plainData . forEach ( data => {
10- if ( ! allCategories . includes ( data . category ) ) {
11- allCategories . push ( data . category )
22+ if ( data . begin < minDate ) {
23+ minDate = data . begin ;
24+ }
25+ if ( data . end > maxDate ) {
26+ maxDate = data . end ;
27+ }
28+ if ( ! allCategories . hasOwnProperty ( data . category ) ) {
29+ allCategories [ data . category ] = 0 ;
30+ }
31+ if ( ! allNames . hasOwnProperty ( data . name ) ) {
32+ allNames [ data . name ] = 0 ;
1233 }
1334 } ) ;
14- var catsColumn = allCategories . length === 1 ? 'name' : 'category' ;
35+ if ( Object . keys ( allCategories ) . length === 1 ) {
36+ var catsColumn = 'name' ;
37+ var allCats = allNames ;
38+ }
39+ else {
40+ var catsColumn = 'category' ;
41+ var allCats = allCategories ;
42+ }
1543
16- var dayMap = {
17- 0 :6 ,
18- 1 :0 ,
19- 2 :1 ,
20- 3 :2 ,
21- 4 :3 ,
22- 5 :4 ,
23- 6 :5 ,
44+ // fill (empty) categories in each day
45+ let plotdata = { } ;
46+ let plotdataLabels = [ ] ;
47+ for ( let timestamp = minDate ; timestamp <= maxDate ; timestamp += 86400 ) {
48+ let label = getLabelFromTimestamp ( timestamp ) ;
49+ plotdata [ label ] = Object . assign ( { } , allCats ) ;
50+ plotdataLabels . push ( label )
2451 }
25- var plotdata = { }
26- plainData . forEach ( ( v ) => {
27- var day = dayMap [ new Date ( v . begin * 1000 ) . getDay ( ) ] ;
28- if ( ! plotdata . hasOwnProperty ( v [ catsColumn ] ) ) {
29- plotdata [ v [ catsColumn ] ] = [ ]
30- for ( var d = 0 ; d < 7 ; d ++ ) {
31- plotdata [ v [ catsColumn ] ] [ d ] = 0 ;
32- }
33- }
34- plotdata [ v [ catsColumn ] ] [ day ] += v . duration ;
52+ let lastLabel = getLabelFromTimestamp ( maxDate ) ;
53+ if ( ! plotdata . hasOwnProperty ( lastLabel ) ) {
54+ plotdata [ lastLabel ] = Object . assign ( { } , allCats ) ;
55+ plotdataLabels . push ( lastLabel )
56+ }
57+
58+ // fill with data
59+ plainData . forEach ( data => {
60+ plotdata [ getLabelFromTimestamp ( data . begin ) ] [ data [ catsColumn ] ] += data . duration ;
3561 } ) ;
3662
37- Object . keys ( plotdata ) . forEach ( function ( category ) {
38- for ( var d = 0 ; d < 7 ; d ++ ) {
39- plotdata [ category ] [ d ] = Math . round ( ( plotdata [ category ] [ d ] / 3600 ) * 100 ) / 100 ;
40- }
63+ // convert to hours
64+ Object . keys ( plotdata ) . forEach ( function ( label ) {
65+ Object . keys ( plotdata [ label ] ) . forEach ( function ( category ) {
66+ plotdata [ label ] [ category ] = Math . round ( ( plotdata [ label ] [ category ] / 3600 ) * 100 ) / 100 ;
67+ } ) ;
4168 } ) ;
4269
4370 /**
@@ -48,19 +75,31 @@ function createGraph(combiData, plainData, singleDayData, canvas){
4875 */
4976 const baseColors = [ '#4E79A7' , '#A0CBE8' , '#F28E2B' , '#FFBE7D' , '#59A14F' , '#8CD17D' , '#B6992D' , '#F1CE63' , '#499894' , '#86BCB6' , '#E15759' , '#FF9D9A' , '#79706E' , '#BAB0AC' , '#D37295' , '#FABFD2' , '#B07AA1' , '#D4A6C8' , '#9D7660' , '#D7B5A6' ] ;
5077
78+ var categoryDatasetIdMap = { } ;
5179 var chartData = {
52- labels : [ 'Monday' , 'Tuesday' , 'Wednesday' , 'Thursday' , 'Friday' , 'Saturday' , 'Sunday' ] ,
80+ labels : plotdataLabels ,
5381 datasets : [ ]
5482 } ;
55- Object . keys ( plotdata ) . forEach ( ( category , index ) => {
56- chartData . datasets . push ( {
57- label : category ,
58- backgroundColor : baseColors [ index % baseColors . length ] ,
59- data : plotdata [ category ]
83+
84+ var datasetIndex = 0 ;
85+ plotdataLabels . forEach ( function ( label ) {
86+ Object . keys ( plotdata [ label ] ) . forEach ( function ( category ) {
87+ if ( ! categoryDatasetIdMap . hasOwnProperty ( category ) ) {
88+ categoryDatasetIdMap [ category ] = datasetIndex ;
89+ chartData . datasets . push ( {
90+ label : category ,
91+ backgroundColor : baseColors [ datasetIndex % baseColors . length ] ,
92+ data : [ ]
93+ } ) ;
94+ datasetIndex ++ ;
95+ }
96+ chartData . datasets [ categoryDatasetIdMap [ category ] ] . data . push (
97+ plotdata [ label ] [ category ]
98+ ) ;
6099 } ) ;
61- } )
100+ } ) ;
62101
63- var config = {
102+ let config = {
64103 type : 'bar' ,
65104 data : chartData ,
66105 options : {
@@ -86,5 +125,6 @@ function createGraph(combiData, plainData, singleDayData, canvas){
86125 }
87126 }
88127 } ;
128+
89129 return new Chart ( canvas , config ) ;
90130}
0 commit comments