1
1
import { Controller } from '@hotwired/stimulus' ;
2
2
import Chart from 'chart.js/auto' ;
3
- import moment from 'moment' ;
4
3
import 'chartjs-adapter-moment' ;
4
+ import zoomPlugin from 'chartjs-plugin-zoom' ;
5
5
import 'select2' ;
6
6
import $ from 'jquery' ;
7
7
8
8
export default class extends Controller {
9
9
chartColors = {
10
+ black : 'rgb(45,45,45)' ,
10
11
red : 'rgb(255, 99, 132)' ,
11
12
orange : 'rgb(255, 159, 64)' ,
12
13
yellow : 'rgb(255, 205, 86)' ,
@@ -21,44 +22,42 @@ export default class extends Controller {
21
22
22
23
connect ( ) {
23
24
this . initChart (
24
- JSON . parse ( this . element . dataset . labels ) ,
25
- JSON . parse ( this . element . dataset . tagData ) ,
26
- this . element . dataset . mainLib
25
+ JSON . parse ( this . element . dataset . libraries ) ,
27
26
) ;
28
27
this . initSelectBox ( ) ;
29
28
}
30
29
31
- initChart ( labels , tagData , mainLib ) {
32
- const momentLabels = labels . forEach ( ( label ) => moment ( label , 'MM-DD-YY' ) ) ;
30
+ initChart ( libraries ) {
33
31
34
32
const ctx = document . getElementById ( 'canvas' ) ;
35
33
this . chartConfig = {
36
34
type : 'line' ,
37
- data : {
38
- labels : momentLabels ,
39
- datasets : [
40
- {
41
- label : mainLib ,
42
- data : tagData ,
43
- fill : false ,
44
- borderColor : 'rgb(45,45,45)' ,
45
- pointRadius : 5 ,
46
- pointHoverRadius : 7 ,
47
- } ,
48
- ] ,
49
- } ,
50
35
options : {
51
36
plugins : {
52
37
tooltip : {
53
38
callbacks : {
54
39
title : function ( tooltipItem ) {
55
- return tooltipItem [ 0 ] . raw . name ;
40
+ return tooltipItem [ 0 ] . dataset . label + ' ' + tooltipItem [ 0 ] . raw . name ;
56
41
} ,
57
42
label : function ( tooltipItem ) {
58
43
return 'Ø Complexity: ' + tooltipItem . formattedValue ;
59
44
} ,
60
45
} ,
61
46
} ,
47
+ zoom : {
48
+ pan : {
49
+ enabled : true ,
50
+ } ,
51
+ zoom : {
52
+ wheel : {
53
+ enabled : true ,
54
+ } ,
55
+ pinch : {
56
+ enabled : true
57
+ } ,
58
+ mode : 'xy' ,
59
+ }
60
+ }
62
61
} ,
63
62
scales : {
64
63
x : {
@@ -74,7 +73,12 @@ export default class extends Controller {
74
73
} ,
75
74
} ,
76
75
} ;
76
+ Chart . register ( zoomPlugin ) ;
77
77
this . chart = new Chart ( ctx , this . chartConfig ) ;
78
+
79
+ libraries . forEach ( library => this . addLibrary ( library [ 'name' ] , library [ 'tags' ] ) )
80
+
81
+ this . chart . update ( ) ;
78
82
}
79
83
80
84
initSelectBox ( ) {
@@ -83,7 +87,7 @@ export default class extends Controller {
83
87
84
88
// register events
85
89
$select . on ( 'select2:select' , this . disableSorting ) ;
86
- $select . on ( 'select2:select' , this . addLibrary . bind ( this ) ) ;
90
+ $select . on ( 'select2:select' , this . selectLibrary . bind ( this ) ) ;
87
91
$select . on ( 'select2:unselect' , this . removeLibrary . bind ( this ) ) ;
88
92
}
89
93
@@ -95,24 +99,27 @@ export default class extends Controller {
95
99
$ ( this ) . trigger ( 'change' ) ;
96
100
}
97
101
98
- addLibrary ( event ) {
99
- const data = event . params . data ;
102
+ addLibrary ( label , data ) {
100
103
const colorName = this . colorNames [ this . chartConfig . data . datasets . length % this . colorNames . length ] ;
101
- const newColor = this . chartColors [ colorName ] ;
102
- const config = this . chartConfig ;
103
- const chart = this . chart ;
104
+ const nextColor = this . chartColors [ colorName ] ;
105
+ const newDataset = {
106
+ label : label ,
107
+ data : data ,
108
+ fill : false ,
109
+ pointRadius : 5 ,
110
+ pointHoverRadius : 7 ,
111
+ borderColor : nextColor ,
112
+ } ;
113
+
114
+ this . chartConfig . data . datasets . push ( newDataset ) ;
115
+ }
116
+
117
+ selectLibrary ( event ) {
118
+ const data = event . params . data ;
119
+ const self = this ;
104
120
$ . ajax ( data . id ) . done ( function ( response ) {
105
- const newDataset = {
106
- label : data . text ,
107
- data : response ,
108
- fill : false ,
109
- pointRadius : 5 ,
110
- pointHoverRadius : 7 ,
111
- borderColor : newColor ,
112
- } ;
113
-
114
- config . data . datasets . push ( newDataset ) ;
115
- chart . update ( ) ;
121
+ self . addLibrary ( data . text , response ) ;
122
+ self . chart . update ( ) ;
116
123
} ) ;
117
124
}
118
125
0 commit comments