@@ -5,59 +5,107 @@ function createGraph(combiData, plainData, singleDayData, canvas){
55 * The function should return the ChartJS object.
66 */
77
8- let plotdata = { } ;
9- plainData . forEach ( data => {
10- let date = new Date ( data . begin * 1000 ) ;
8+ function getLabelFromTimestamp ( t ) {
9+ let date = new Date ( t * 1000 ) ;
1110 let day = ( date . getDate ( ) > 9 ? '' : '0' ) + date . getDate ( ) ;
1211 let month = ( date . getMonth ( ) + 1 > 9 ? '' : '0' ) + ( date . getMonth ( ) + 1 ) ;
13-
14- let key = `${ day } .${ month } .${ date . getFullYear ( ) } ` ;
15- if ( ! plotdata . hasOwnProperty ( key ) ) {
16- plotdata [ key ] = 0 ;
17- }
1812
19- plotdata [ key ] += data . duration ;
20- } ) ;
13+ return ` ${ day } . ${ month } . ${ date . getFullYear ( ) } ` ;
14+ }
2115
22- Object . keys ( plotdata ) . forEach ( key => {
23- plotdata [ key ] = Math . round ( ( plotdata [ key ] / 3600 ) * 100 ) / 100 ;
16+ // get time span and all categories
17+ var minDate = Number . MAX_SAFE_INTEGER ;
18+ var maxDate = - 1 ;
19+ var allCategories = { }
20+ plainData . forEach ( data => {
21+ if ( data . begin < minDate ) {
22+ minDate = data . begin ;
23+ }
24+ if ( data . end > maxDate ) {
25+ maxDate = data . end ;
26+ }
27+ if ( ! allCategories . hasOwnProperty ( data . category ) ) {
28+ allCategories [ data . category ] = 0 ;
29+ }
2430 } ) ;
2531
26- let plotdataValues = [ ] ;
32+ // fill (empty) categories in each day
33+ let plotdata = { } ;
2734 let plotdataLabels = [ ] ;
28- plotdataLabels = Object . keys ( plotdata ) . sort ( ( a , b ) => {
29- return ( b . split ( '.' ) . reverse ( ) . join ( '-' ) < a . split ( '.' ) . reverse ( ) . join ( '-' ) ) - 1 ;
30- } ) ;
31- plotdataLabels . forEach ( key => {
32- plotdataValues . push ( plotdata [ key ] ) ;
35+ for ( timestamp = minDate ; timestamp <= maxDate ; timestamp += 86400 ) {
36+ let label = getLabelFromTimestamp ( timestamp ) ;
37+ plotdata [ label ] = Object . assign ( { } , allCategories ) ;
38+ plotdataLabels . push ( label )
39+ }
40+
41+ // fill with data
42+ plainData . forEach ( data => {
43+ plotdata [ getLabelFromTimestamp ( data . begin ) ] [ data . category ] += data . duration ;
44+ } ) ;
45+
46+ // convert to hours
47+ Object . keys ( plotdata ) . forEach ( function ( label ) {
48+ Object . keys ( plotdata [ label ] ) . forEach ( function ( category ) {
49+ plotdata [ label ] [ category ] = Math . round ( ( plotdata [ label ] [ category ] / 3600 ) * 100 ) / 100 ;
3350 } ) ;
34-
51+ } ) ;
52+
3553 /**
3654 * Colors from
3755 * chartjs-plugin-colorschemes MIT License
3856 * Copyright (c) 2019 Akihiko Kusanagi
3957 * https://github.com/nagix/chartjs-plugin-colorschemes/blob/master/src/colorschemes/colorschemes.tableau.js
4058 */
59+ const baseColors = [ '#4E79A7' , '#A0CBE8' , '#F28E2B' , '#FFBE7D' , '#59A14F' , '#8CD17D' , '#B6992D' , '#F1CE63' , '#499894' , '#86BCB6' , '#E15759' , '#FF9D9A' , '#79706E' , '#BAB0AC' , '#D37295' , '#FABFD2' , '#B07AA1' , '#D4A6C8' , '#9D7660' , '#D7B5A6' ] ;
60+
61+ var categoryDatasetIdMap = { } ;
62+ var chartData = {
63+ labels : plotdataLabels ,
64+ datasets : [ ]
65+ } ;
66+
67+ var datasetIndex = 0 ;
68+ plotdataLabels . forEach ( function ( label ) {
69+ Object . keys ( plotdata [ label ] ) . forEach ( function ( category ) {
70+ if ( ! categoryDatasetIdMap . hasOwnProperty ( category ) ) {
71+ categoryDatasetIdMap [ category ] = datasetIndex ;
72+ chartData . datasets . push ( {
73+ label : category ,
74+ backgroundColor : baseColors [ datasetIndex % baseColors . length ] ,
75+ data : [ ]
76+ } ) ;
77+ datasetIndex ++ ;
78+ }
79+ chartData . datasets [ categoryDatasetIdMap [ category ] ] . data . push (
80+ plotdata [ label ] [ category ]
81+ ) ;
82+ } ) ;
83+ } ) ;
84+
4185 let config = {
4286 type : 'bar' ,
43- data : {
44- datasets : [ {
45- data : plotdataValues ,
46- label : 'Daily work' ,
47- backgroundColor : '#A0CBE8' ,
48- borderColor : '#4E79A7' ,
49- borderWidth : 1
50- } ] ,
51- labels : plotdataLabels
52- } ,
87+ data : chartData ,
5388 options : {
5489 responsive : true ,
5590 tooltips : {
5691 callbacks : {
5792 label : function ( tooltipItem , chartData ) {
58- return `Daily work: ${ chartData . datasets [ tooltipItem . datasetIndex ] . data [ tooltipItem . index ] } hours` ;
93+ return `${ chartData . datasets [ tooltipItem . datasetIndex ] . label } ${ chartData . datasets [ tooltipItem . datasetIndex ] . data [ tooltipItem . index ] } hours` ;
94+ } ,
95+ title : function ( tooltipItem , chartData ) {
96+ var daySum = chartData . datasets . reduce ( ( p , c ) => p + c . data [ tooltipItem [ 0 ] . index ] , 0 ) ;
97+ return `${ tooltipItem [ 0 ] . label } : ${ daySum } hours` ;
5998 }
6099 }
100+ } ,
101+ scales : {
102+ xAxes : [ {
103+ stacked : true ,
104+ beginAtZero : true
105+ } ] ,
106+ yAxes : [ {
107+ stacked : true
108+ } ]
61109 }
62110 }
63111 } ;
0 commit comments