chartjs-ror 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +71 -136
- data/lib/chartjs/chart_helpers.rb +23 -39
- data/lib/chartjs/version.rb +1 -1
- data/vendor/assets/javascripts/Chart.js +160 -82
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f2ebce780d9ca9649f2b1fcd39b5fa6fa09db3b
|
4
|
+
data.tar.gz: 1363a9862e86500e3387284e7e43d95ba3cb91be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 007b7d77f5c06bdd6c18cc782940073624d469e8e4ec00c582d156702c5fee413412baae7f7091e660305aac22a77f8a00ed254eace2ea128d507287954ec06a
|
7
|
+
data.tar.gz: 9030000d33387b7259a27cb871df2d7906867f7f2d9f31b6a6cf636444f7797fed42371f3d0577564f0d70a99077be465b094dd412d174b6e3b051f8bad28737
|
data/README.md
CHANGED
@@ -33,36 +33,44 @@ You only need [excanvas][ExplorerCanvas] for IE7 and IE8. Add [Modernizr][] if
|
|
33
33
|
|
34
34
|
Each chart type has a corresponding helper for your views. The helper methods take the same arguments as their Javascript counterparts. The `options` are always optional.
|
35
35
|
|
36
|
-
### Charts with multiple datasets
|
37
36
|
|
38
37
|
```erb
|
39
|
-
<%= line_chart
|
40
|
-
<%= bar_chart
|
41
|
-
<%= radar_chart
|
38
|
+
<%= line_chart data, options %>
|
39
|
+
<%= bar_chart data, options %>
|
40
|
+
<%= radar_chart data, options %>
|
41
|
+
<%= polar_chart data, options %>
|
42
|
+
<%= pie_chart data, options %>
|
43
|
+
<%= doughnut_chart data, options %>
|
42
44
|
```
|
43
45
|
|
44
46
|
For example, to render a [line chart][linechart] in Javascript:
|
45
47
|
|
46
48
|
```javascript
|
47
49
|
var data = {
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
50
|
+
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
51
|
+
datasets: [
|
52
|
+
{
|
53
|
+
label: "My First dataset",
|
54
|
+
fillColor: "rgba(220,220,220,0.2)",
|
55
|
+
strokeColor: "rgba(220,220,220,1)",
|
56
|
+
pointColor: "rgba(220,220,220,1)",
|
57
|
+
pointStrokeColor: "#fff",
|
58
|
+
pointHighlightFill: "#fff",
|
59
|
+
pointHighlightStroke: "rgba(220,220,220,1)",
|
60
|
+
data: [65, 59, 80, 81, 56, 55, 40]
|
61
|
+
},
|
62
|
+
{
|
63
|
+
label: "My Second dataset",
|
64
|
+
fillColor: "rgba(151,187,205,0.2)",
|
65
|
+
strokeColor: "rgba(151,187,205,1)",
|
66
|
+
pointColor: "rgba(151,187,205,1)",
|
67
|
+
pointStrokeColor: "#fff",
|
68
|
+
pointHighlightFill: "#fff",
|
69
|
+
pointHighlightStroke: "rgba(151,187,205,1)",
|
70
|
+
data: [28, 48, 40, 19, 86, 27, 90]
|
71
|
+
}
|
72
|
+
]
|
73
|
+
};
|
66
74
|
var options = {};
|
67
75
|
new Chart(ctx).Line(data,options);
|
68
76
|
```
|
@@ -70,109 +78,44 @@ new Chart(ctx).Line(data,options);
|
|
70
78
|
The Ruby equivalent is:
|
71
79
|
|
72
80
|
```ruby
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
81
|
+
data = {
|
82
|
+
labels: ["January", "February", "March", "April", "May", "June", "July"],
|
83
|
+
datasets: [
|
84
|
+
{
|
85
|
+
label: "My First dataset",
|
86
|
+
fillColor: "rgba(220,220,220,0.2)",
|
87
|
+
strokeColor: "rgba(220,220,220,1)",
|
88
|
+
pointColor: "rgba(220,220,220,1)",
|
89
|
+
pointStrokeColor: "#fff",
|
90
|
+
pointHighlightFill: "#fff",
|
91
|
+
pointHighlightStroke: "rgba(220,220,220,1)",
|
92
|
+
data: [65, 59, 80, 81, 56, 55, 40]
|
93
|
+
},
|
94
|
+
{
|
95
|
+
label: "My Second dataset",
|
96
|
+
fillColor: "rgba(151,187,205,0.2)",
|
97
|
+
strokeColor: "rgba(151,187,205,1)",
|
98
|
+
pointColor: "rgba(151,187,205,1)",
|
99
|
+
pointStrokeColor: "#fff",
|
100
|
+
pointHighlightFill: "#fff",
|
101
|
+
pointHighlightStroke: "rgba(151,187,205,1)",
|
102
|
+
data: [28, 48, 40, 19, 86, 27, 90]
|
103
|
+
}
|
104
|
+
]
|
91
105
|
}
|
92
|
-
|
93
|
-
<%= line_chart
|
94
|
-
```
|
95
|
-
|
96
|
-
### Charts with one dataset
|
97
|
-
|
98
|
-
```erb
|
99
|
-
<%= polar_chart data, options %>
|
100
|
-
<%= pie_chart data, options %>
|
101
|
-
<%= doughnut_chart data, options %>
|
102
|
-
```
|
103
|
-
|
104
|
-
For example, to render a [pie chart][piechart] in Javascript:
|
105
|
-
|
106
|
-
```javascript
|
107
|
-
var data = [
|
108
|
-
{
|
109
|
-
value : 30,
|
110
|
-
color: "#D97041"
|
111
|
-
},
|
112
|
-
{
|
113
|
-
value : 90,
|
114
|
-
color: "#C7604C"
|
115
|
-
},
|
116
|
-
{
|
117
|
-
value : 24,
|
118
|
-
color: "#21323D"
|
119
|
-
},
|
120
|
-
{
|
121
|
-
value : 58,
|
122
|
-
color: "#9D9B7F"
|
123
|
-
},
|
124
|
-
{
|
125
|
-
value : 82,
|
126
|
-
color: "#7D4F6D"
|
127
|
-
},
|
128
|
-
{
|
129
|
-
value : 8,
|
130
|
-
color: "#584A5E"
|
131
|
-
}
|
132
|
-
]
|
133
|
-
new Chart(ctx).Pie(data,options);
|
134
|
-
```
|
135
|
-
|
136
|
-
And in Ruby:
|
137
|
-
|
138
|
-
```ruby
|
139
|
-
@data = [
|
140
|
-
{
|
141
|
-
value: 30,
|
142
|
-
color: "#D97041"
|
143
|
-
},
|
144
|
-
{
|
145
|
-
value: 90,
|
146
|
-
color: "#C7604C"
|
147
|
-
},
|
148
|
-
{
|
149
|
-
value: 24,
|
150
|
-
color: "#21323D"
|
151
|
-
},
|
152
|
-
{
|
153
|
-
value: 58,
|
154
|
-
color: "#9D9B7F"
|
155
|
-
},
|
156
|
-
{
|
157
|
-
value: 82,
|
158
|
-
color: "#7D4F6D"
|
159
|
-
},
|
160
|
-
{
|
161
|
-
value: 8,
|
162
|
-
color: "#584A5E"
|
163
|
-
}
|
164
|
-
]
|
165
|
-
<%= pie_chart @data %>
|
106
|
+
options = {}
|
107
|
+
<%= line_chart data, options %>
|
166
108
|
```
|
167
109
|
|
168
110
|
### Options
|
169
111
|
|
170
112
|
You can put anything in the `options` hash that Chart.js recognises. It also supports these non-Chart.js settings:
|
171
113
|
|
172
|
-
* `:class`
|
173
|
-
* `:element_id`
|
174
|
-
* `:width`
|
175
|
-
* `:height`
|
114
|
+
* `:class` - class of the enclosing `<figure/>` - default is `chart`.
|
115
|
+
* `:element_id` - id of the `<canvas/>` - default is `chart-n` where `n` is the 0-based index of the chart on the page.
|
116
|
+
* `:width` - width of the canvas in px - default is `400`.
|
117
|
+
* `:height` - height of the canvas in px - default is `400`.
|
118
|
+
* `:generateLegend` - whether or not to generate a legend - default is `false`.
|
176
119
|
|
177
120
|
### Sample output:
|
178
121
|
|
@@ -195,17 +138,17 @@ You can put anything in the `options` hash that Chart.js recognises. It also su
|
|
195
138
|
window.Chart["chart-0"] = chart;
|
196
139
|
|
197
140
|
var legend = chart.generateLegend();
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
canvas.parentNode.insertBefore(legendHolder.firstChild, canvas.nextSibling);
|
202
|
-
}
|
141
|
+
var legendHolder = document.createElement("div");
|
142
|
+
legendHolder.innerHTML = legend;
|
143
|
+
canvas.parentNode.insertBefore(legendHolder.firstChild, canvas.nextSibling);
|
203
144
|
};
|
204
145
|
if (window.addEventListener) {
|
205
|
-
window.addEventListener(
|
146
|
+
window.addEventListener("load", initChart, false);
|
147
|
+
document.addEventListener("page:load", initChart, false);
|
206
148
|
}
|
207
149
|
else if (window.attachEvent) {
|
208
|
-
window.attachEvent(
|
150
|
+
window.attachEvent("onload", initChart);
|
151
|
+
document.attachEvent("page:load", initChart);
|
209
152
|
}
|
210
153
|
})();
|
211
154
|
</script>
|
@@ -214,11 +157,11 @@ You can put anything in the `options` hash that Chart.js recognises. It also su
|
|
214
157
|
The Javascript is actually written out on a single line but you get the idea.
|
215
158
|
|
216
159
|
|
217
|
-
### Templates (tooltips and legends)
|
160
|
+
### Templates (tooltips and legends) and Rails views
|
218
161
|
|
219
162
|
If you specify a custom template, e.g. in `legendTemplate` or `tooltipTemplate`, you must escape opening tags in the Javascript-template string, i.e. use `<%%= value %>` instead of `<%= value %>`.
|
220
163
|
|
221
|
-
You need to add an escape `%` character for each level of rendering. For
|
164
|
+
You need to add an escape `%` character for each level of rendering. For example:
|
222
165
|
|
223
166
|
- If your view calls the chart helper directly, use `<%%= value %>`.
|
224
167
|
- If your view renders a partial which calls the chart helper, use `<%%%= value %>`.
|
@@ -226,9 +169,7 @@ You need to add an escape `%` character for each level of rendering. For exampe
|
|
226
169
|
|
227
170
|
### Legend
|
228
171
|
|
229
|
-
|
230
|
-
|
231
|
-
If you don't want a legend, supply `legendTemplate: " "` in the options for your chart. For some reason an empty string causes an exception inside Chart.js so use a single space.
|
172
|
+
If you pass the option `generateLegend: true`, a legend will be rendered using `chart.generateLegend()` ([docs][advanced]).
|
232
173
|
|
233
174
|
|
234
175
|
### Scale calculations
|
@@ -236,12 +177,6 @@ If you don't want a legend, supply `legendTemplate: " "` in the options for your
|
|
236
177
|
The plugin implements its own abscissa scale calculations which I prefer to Chart.js's (see [Chart.js#132][calculations]). You can opt-in to these calculations by passing `scaleOverride: true` in the `options` hash, without any of the other scale override keys (`scaleSteps`, `scaleStepWidth`, `scaleStartValue`).
|
237
178
|
|
238
179
|
|
239
|
-
## Inspiration
|
240
|
-
|
241
|
-
* [Chart.js][] (obviously)
|
242
|
-
* [Chartkick][]
|
243
|
-
|
244
|
-
|
245
180
|
## Intellectual Property
|
246
181
|
|
247
182
|
Copyright Andrew Stewart, AirBlade Software. Released under the MIT licence.
|
@@ -1,33 +1,16 @@
|
|
1
1
|
module Chartjs
|
2
2
|
module ChartHelpers
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
chart 'Bar', labels, datasets, options
|
10
|
-
end
|
11
|
-
|
12
|
-
def radar_chart(labels, datasets, options = {})
|
13
|
-
chart 'Radar', labels, datasets, options
|
14
|
-
end
|
15
|
-
|
16
|
-
def polar_area_chart(data, options = {})
|
17
|
-
chart 'PolarArea', nil, data, options
|
18
|
-
end
|
19
|
-
|
20
|
-
def pie_chart(data, options = {})
|
21
|
-
chart 'Pie', nil, data, options
|
22
|
-
end
|
23
|
-
|
24
|
-
def doughnut_chart(data, options = {})
|
25
|
-
chart 'Doughnut', nil, data, options
|
4
|
+
%w[ Line Bar Radar PolarArea Pie Doughnut ].each do |type|
|
5
|
+
camel_type = type.gsub(/(\w)([A-Z])/, '\1_\2').downcase
|
6
|
+
define_method "#{camel_type}_chart" do |data, options = {}| # def polar_area_chart(data, options = {})
|
7
|
+
chart type, data, options # chart 'PolarArea', data, options
|
8
|
+
end # end
|
26
9
|
end
|
27
10
|
|
28
11
|
private
|
29
12
|
|
30
|
-
def chart(klass,
|
13
|
+
def chart(klass, data, options)
|
31
14
|
@chart_id ||= -1
|
32
15
|
element_id = options.delete(:id) || "chart-#{@chart_id += 1}"
|
33
16
|
css_class = options.delete(:class) || 'chart'
|
@@ -39,14 +22,22 @@ module Chartjs
|
|
39
22
|
|
40
23
|
# Alternative scale calculations.
|
41
24
|
if options[:scaleOverride] && !options.has_key?(:scaleSteps)
|
42
|
-
options.merge! ordinate_scale(combined_data(
|
25
|
+
options.merge! ordinate_scale(combined_data(data))
|
43
26
|
end
|
44
27
|
|
28
|
+
generate_legend = options.delete :generateLegend
|
29
|
+
legend = <<-END
|
30
|
+
var legend = chart.generateLegend();
|
31
|
+
var legendHolder = document.createElement("div");
|
32
|
+
legendHolder.innerHTML = legend;
|
33
|
+
canvas.parentNode.insertBefore(legendHolder.firstChild, canvas.nextSibling);
|
34
|
+
END
|
35
|
+
|
45
36
|
script = javascript_tag do
|
46
37
|
<<-END.squish.html_safe
|
47
38
|
(function() {
|
48
39
|
var initChart = function() {
|
49
|
-
var data = #{
|
40
|
+
var data = #{data.to_json};
|
50
41
|
var opts = #{options.to_json};
|
51
42
|
if (!("animation" in opts)) {
|
52
43
|
opts["animation"] = (typeof Modernizr == "undefined") || Modernizr.canvas;
|
@@ -56,20 +47,17 @@ module Chartjs
|
|
56
47
|
var chart = new Chart(ctx).#{klass}(data, opts);
|
57
48
|
window.Chart[#{element_id.to_json}] = chart;
|
58
49
|
|
59
|
-
|
60
|
-
if (legend.trim().length > 0) {
|
61
|
-
var legendHolder = document.createElement("div");
|
62
|
-
legendHolder.innerHTML = legend;
|
63
|
-
canvas.parentNode.insertBefore(legendHolder.firstChild, canvas.nextSibling);
|
64
|
-
}
|
50
|
+
#{legend if generate_legend}
|
65
51
|
};
|
66
52
|
/* W3C standard */
|
67
53
|
if (window.addEventListener) {
|
68
54
|
window.addEventListener("load", initChart, false);
|
55
|
+
document.addEventListener("page:load", initChart, false);
|
69
56
|
}
|
70
57
|
/* IE */
|
71
58
|
else if (window.attachEvent) {
|
72
59
|
window.attachEvent("onload", initChart);
|
60
|
+
document.attachEvent("page:load", initChart);
|
73
61
|
}
|
74
62
|
})();
|
75
63
|
END
|
@@ -78,17 +66,13 @@ module Chartjs
|
|
78
66
|
content_tag(:figure, canvas, class: css_class) + script
|
79
67
|
end
|
80
68
|
|
81
|
-
def
|
82
|
-
if
|
83
|
-
|
69
|
+
def combined_data(data)
|
70
|
+
if data.is_a? Array
|
71
|
+
data.map { |datum| datum[:value] }
|
84
72
|
else
|
85
|
-
datasets.
|
73
|
+
data[:datasets].flat_map { |dataset| dataset[:data] }
|
86
74
|
end
|
87
75
|
end
|
88
76
|
|
89
|
-
def combined_data(datasets)
|
90
|
-
datasets.map { |d| d[:data] || d[:value] }.flatten
|
91
|
-
end
|
92
|
-
|
93
77
|
end
|
94
78
|
end
|
data/lib/chartjs/version.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
/*!
|
2
2
|
* Chart.js
|
3
3
|
* http://chartjs.org/
|
4
|
-
* Version: 1.0.1
|
4
|
+
* Version: 1.0.1
|
5
5
|
*
|
6
|
-
* Copyright
|
6
|
+
* Copyright 2015 Nick Downie
|
7
7
|
* Released under the MIT license
|
8
8
|
* https://github.com/nnnick/Chart.js/blob/master/LICENSE.md
|
9
9
|
*/
|
@@ -92,12 +92,15 @@
|
|
92
92
|
// Boolean - whether or not the chart should be responsive and resize when the browser does.
|
93
93
|
responsive: false,
|
94
94
|
|
95
|
-
|
96
|
-
|
95
|
+
// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
|
96
|
+
maintainAspectRatio: true,
|
97
97
|
|
98
98
|
// Boolean - Determines whether to draw tooltips on the canvas or not - attaches events to touchmove & mousemove
|
99
99
|
showTooltips: true,
|
100
100
|
|
101
|
+
// Boolean - Determines whether to draw built-in tooltip or call custom tooltip function
|
102
|
+
customTooltips: false,
|
103
|
+
|
101
104
|
// Array - Array of string names to attach tooltip events
|
102
105
|
tooltipEvents: ["mousemove", "touchstart", "touchmove", "mouseout"],
|
103
106
|
|
@@ -238,7 +241,7 @@
|
|
238
241
|
if (filterCallback(currentItem)){
|
239
242
|
return currentItem;
|
240
243
|
}
|
241
|
-
}
|
244
|
+
}
|
242
245
|
},
|
243
246
|
findPreviousWhere = helpers.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex){
|
244
247
|
// Default to end of the array
|
@@ -250,7 +253,7 @@
|
|
250
253
|
if (filterCallback(currentItem)){
|
251
254
|
return currentItem;
|
252
255
|
}
|
253
|
-
}
|
256
|
+
}
|
254
257
|
},
|
255
258
|
inherits = helpers.inherits = function(extensions){
|
256
259
|
//Basic javascript inheritance based on the model created in Backbone.js
|
@@ -441,7 +444,9 @@
|
|
441
444
|
//Templating methods
|
442
445
|
//Javascript micro templating by John Resig - source at http://ejohn.org/blog/javascript-micro-templating/
|
443
446
|
template = helpers.template = function(templateString, valuesObject){
|
444
|
-
|
447
|
+
|
448
|
+
// If templateString is function rather than string-template - call the function for valuesObject
|
449
|
+
|
445
450
|
if(templateString instanceof Function){
|
446
451
|
return templateString(valuesObject);
|
447
452
|
}
|
@@ -830,7 +835,7 @@
|
|
830
835
|
newHeight = this.options.maintainAspectRatio ? newWidth / this.chart.aspectRatio : getMaximumHeight(this.chart.canvas);
|
831
836
|
|
832
837
|
canvas.width = this.chart.width = newWidth;
|
833
|
-
canvas.height =
|
838
|
+
canvas.height = this.chart.height = newHeight;
|
834
839
|
|
835
840
|
retinaScale(this.chart);
|
836
841
|
|
@@ -866,6 +871,21 @@
|
|
866
871
|
destroy : function(){
|
867
872
|
this.clear();
|
868
873
|
unbindEvents(this, this.events);
|
874
|
+
var canvas = this.chart.canvas;
|
875
|
+
|
876
|
+
// Reset canvas height/width attributes starts a fresh with the canvas context
|
877
|
+
canvas.width = this.chart.width;
|
878
|
+
canvas.height = this.chart.height;
|
879
|
+
|
880
|
+
// < IE9 doesn't support removeProperty
|
881
|
+
if (canvas.style.removeProperty) {
|
882
|
+
canvas.style.removeProperty('width');
|
883
|
+
canvas.style.removeProperty('height');
|
884
|
+
} else {
|
885
|
+
canvas.style.removeAttribute('width');
|
886
|
+
canvas.style.removeAttribute('height');
|
887
|
+
}
|
888
|
+
|
869
889
|
delete Chart.instances[this.id];
|
870
890
|
},
|
871
891
|
showTooltip : function(ChartElements, forceRedraw){
|
@@ -895,6 +915,9 @@
|
|
895
915
|
this.activeElements = ChartElements;
|
896
916
|
}
|
897
917
|
this.draw();
|
918
|
+
if(this.options.customTooltips){
|
919
|
+
this.options.customTooltips(false);
|
920
|
+
}
|
898
921
|
if (ChartElements.length > 0){
|
899
922
|
// If we have multiple datasets, show a MultiTooltip for all of the data points at that index
|
900
923
|
if (this.datasets && this.datasets.length > 1) {
|
@@ -975,7 +998,8 @@
|
|
975
998
|
legendColorBackground : this.options.multiTooltipKeyBackground,
|
976
999
|
title: ChartElements[0].label,
|
977
1000
|
chart: this.chart,
|
978
|
-
ctx: this.chart.ctx
|
1001
|
+
ctx: this.chart.ctx,
|
1002
|
+
custom: this.options.customTooltips
|
979
1003
|
}).draw();
|
980
1004
|
|
981
1005
|
} else {
|
@@ -994,7 +1018,8 @@
|
|
994
1018
|
caretHeight: this.options.tooltipCaretSize,
|
995
1019
|
cornerRadius: this.options.tooltipCornerRadius,
|
996
1020
|
text: template(this.options.tooltipTemplate, Element),
|
997
|
-
chart: this.chart
|
1021
|
+
chart: this.chart,
|
1022
|
+
custom: this.options.customTooltips
|
998
1023
|
}).draw();
|
999
1024
|
}, this);
|
1000
1025
|
}
|
@@ -1250,7 +1275,7 @@
|
|
1250
1275
|
this.yAlign = "above";
|
1251
1276
|
|
1252
1277
|
//Distance between the actual element.y position and the start of the tooltip caret
|
1253
|
-
var caretPadding = 2;
|
1278
|
+
var caretPadding = this.caretPadding = 2;
|
1254
1279
|
|
1255
1280
|
var tooltipWidth = ctx.measureText(this.text).width + 2*this.xPadding,
|
1256
1281
|
tooltipRectHeight = this.fontSize + 2*this.yPadding,
|
@@ -1272,47 +1297,53 @@
|
|
1272
1297
|
|
1273
1298
|
ctx.fillStyle = this.fillColor;
|
1274
1299
|
|
1275
|
-
|
1276
|
-
{
|
1277
|
-
|
1278
|
-
//Draw a caret above the x/y
|
1279
|
-
ctx.beginPath();
|
1280
|
-
ctx.moveTo(this.x,this.y - caretPadding);
|
1281
|
-
ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1282
|
-
ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1283
|
-
ctx.closePath();
|
1284
|
-
ctx.fill();
|
1285
|
-
break;
|
1286
|
-
case "below":
|
1287
|
-
tooltipY = this.y + caretPadding + this.caretHeight;
|
1288
|
-
//Draw a caret below the x/y
|
1289
|
-
ctx.beginPath();
|
1290
|
-
ctx.moveTo(this.x, this.y + caretPadding);
|
1291
|
-
ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1292
|
-
ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1293
|
-
ctx.closePath();
|
1294
|
-
ctx.fill();
|
1295
|
-
break;
|
1300
|
+
// Custom Tooltips
|
1301
|
+
if(this.custom){
|
1302
|
+
this.custom(this);
|
1296
1303
|
}
|
1304
|
+
else{
|
1305
|
+
switch(this.yAlign)
|
1306
|
+
{
|
1307
|
+
case "above":
|
1308
|
+
//Draw a caret above the x/y
|
1309
|
+
ctx.beginPath();
|
1310
|
+
ctx.moveTo(this.x,this.y - caretPadding);
|
1311
|
+
ctx.lineTo(this.x + this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1312
|
+
ctx.lineTo(this.x - this.caretHeight, this.y - (caretPadding + this.caretHeight));
|
1313
|
+
ctx.closePath();
|
1314
|
+
ctx.fill();
|
1315
|
+
break;
|
1316
|
+
case "below":
|
1317
|
+
tooltipY = this.y + caretPadding + this.caretHeight;
|
1318
|
+
//Draw a caret below the x/y
|
1319
|
+
ctx.beginPath();
|
1320
|
+
ctx.moveTo(this.x, this.y + caretPadding);
|
1321
|
+
ctx.lineTo(this.x + this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1322
|
+
ctx.lineTo(this.x - this.caretHeight, this.y + caretPadding + this.caretHeight);
|
1323
|
+
ctx.closePath();
|
1324
|
+
ctx.fill();
|
1325
|
+
break;
|
1326
|
+
}
|
1297
1327
|
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
1301
|
-
|
1302
|
-
|
1303
|
-
|
1304
|
-
|
1305
|
-
|
1306
|
-
|
1328
|
+
switch(this.xAlign)
|
1329
|
+
{
|
1330
|
+
case "left":
|
1331
|
+
tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight);
|
1332
|
+
break;
|
1333
|
+
case "right":
|
1334
|
+
tooltipX = this.x - (this.cornerRadius + this.caretHeight);
|
1335
|
+
break;
|
1336
|
+
}
|
1307
1337
|
|
1308
|
-
|
1338
|
+
drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius);
|
1309
1339
|
|
1310
|
-
|
1340
|
+
ctx.fill();
|
1311
1341
|
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1342
|
+
ctx.fillStyle = this.textColor;
|
1343
|
+
ctx.textAlign = "center";
|
1344
|
+
ctx.textBaseline = "middle";
|
1345
|
+
ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2);
|
1346
|
+
}
|
1316
1347
|
}
|
1317
1348
|
});
|
1318
1349
|
|
@@ -1366,36 +1397,42 @@
|
|
1366
1397
|
|
1367
1398
|
},
|
1368
1399
|
draw : function(){
|
1369
|
-
|
1370
|
-
|
1371
|
-
|
1372
|
-
|
1373
|
-
|
1400
|
+
// Custom Tooltips
|
1401
|
+
if(this.custom){
|
1402
|
+
this.custom(this);
|
1403
|
+
}
|
1404
|
+
else{
|
1405
|
+
drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius);
|
1406
|
+
var ctx = this.ctx;
|
1407
|
+
ctx.fillStyle = this.fillColor;
|
1408
|
+
ctx.fill();
|
1409
|
+
ctx.closePath();
|
1374
1410
|
|
1375
|
-
|
1376
|
-
|
1377
|
-
|
1378
|
-
|
1411
|
+
ctx.textAlign = "left";
|
1412
|
+
ctx.textBaseline = "middle";
|
1413
|
+
ctx.fillStyle = this.titleTextColor;
|
1414
|
+
ctx.font = this.titleFont;
|
1379
1415
|
|
1380
|
-
|
1416
|
+
ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0));
|
1381
1417
|
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1418
|
+
ctx.font = this.font;
|
1419
|
+
helpers.each(this.labels,function(label,index){
|
1420
|
+
ctx.fillStyle = this.textColor;
|
1421
|
+
ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1));
|
1386
1422
|
|
1387
|
-
|
1388
|
-
|
1389
|
-
|
1423
|
+
//A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas)
|
1424
|
+
//ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1425
|
+
//Instead we'll make a white filled block to put the legendColour palette over.
|
1390
1426
|
|
1391
|
-
|
1392
|
-
|
1427
|
+
ctx.fillStyle = this.legendColorBackground;
|
1428
|
+
ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1393
1429
|
|
1394
|
-
|
1395
|
-
|
1430
|
+
ctx.fillStyle = this.legendColors[index].fill;
|
1431
|
+
ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
|
1396
1432
|
|
1397
1433
|
|
1398
|
-
|
1434
|
+
},this);
|
1435
|
+
}
|
1399
1436
|
}
|
1400
1437
|
});
|
1401
1438
|
|
@@ -1560,14 +1597,24 @@
|
|
1560
1597
|
ctx.font = this.font;
|
1561
1598
|
each(this.yLabels,function(labelString,index){
|
1562
1599
|
var yLabelCenter = this.endPoint - (yLabelGap * index),
|
1563
|
-
linePositionY = Math.round(yLabelCenter)
|
1600
|
+
linePositionY = Math.round(yLabelCenter),
|
1601
|
+
drawHorizontalLine = this.showHorizontalLines;
|
1564
1602
|
|
1565
1603
|
ctx.textAlign = "right";
|
1566
1604
|
ctx.textBaseline = "middle";
|
1567
1605
|
if (this.showLabels){
|
1568
1606
|
ctx.fillText(labelString,xStart - 10,yLabelCenter);
|
1569
1607
|
}
|
1570
|
-
|
1608
|
+
|
1609
|
+
// This is X axis, so draw it
|
1610
|
+
if (index === 0 && !drawHorizontalLine){
|
1611
|
+
drawHorizontalLine = true;
|
1612
|
+
}
|
1613
|
+
|
1614
|
+
if (drawHorizontalLine){
|
1615
|
+
ctx.beginPath();
|
1616
|
+
}
|
1617
|
+
|
1571
1618
|
if (index > 0){
|
1572
1619
|
// This is a grid line in the centre, so drop that
|
1573
1620
|
ctx.lineWidth = this.gridLineWidth;
|
@@ -1580,10 +1627,12 @@
|
|
1580
1627
|
|
1581
1628
|
linePositionY += helpers.aliasPixel(ctx.lineWidth);
|
1582
1629
|
|
1583
|
-
|
1584
|
-
|
1585
|
-
|
1586
|
-
|
1630
|
+
if(drawHorizontalLine){
|
1631
|
+
ctx.moveTo(xStart, linePositionY);
|
1632
|
+
ctx.lineTo(this.width, linePositionY);
|
1633
|
+
ctx.stroke();
|
1634
|
+
ctx.closePath();
|
1635
|
+
}
|
1587
1636
|
|
1588
1637
|
ctx.lineWidth = this.lineWidth;
|
1589
1638
|
ctx.strokeStyle = this.lineColor;
|
@@ -1599,9 +1648,17 @@
|
|
1599
1648
|
var xPos = this.calculateX(index) + aliasPixel(this.lineWidth),
|
1600
1649
|
// Check to see if line/bar here and decide where to place the line
|
1601
1650
|
linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + aliasPixel(this.lineWidth),
|
1602
|
-
isRotated = (this.xLabelRotation > 0)
|
1651
|
+
isRotated = (this.xLabelRotation > 0),
|
1652
|
+
drawVerticalLine = this.showVerticalLines;
|
1603
1653
|
|
1604
|
-
|
1654
|
+
// This is Y axis, so draw it
|
1655
|
+
if (index === 0 && !drawVerticalLine){
|
1656
|
+
drawVerticalLine = true;
|
1657
|
+
}
|
1658
|
+
|
1659
|
+
if (drawVerticalLine){
|
1660
|
+
ctx.beginPath();
|
1661
|
+
}
|
1605
1662
|
|
1606
1663
|
if (index > 0){
|
1607
1664
|
// This is a grid line in the centre, so drop that
|
@@ -1612,10 +1669,13 @@
|
|
1612
1669
|
ctx.lineWidth = this.lineWidth;
|
1613
1670
|
ctx.strokeStyle = this.lineColor;
|
1614
1671
|
}
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
|
1672
|
+
|
1673
|
+
if (drawVerticalLine){
|
1674
|
+
ctx.moveTo(linePos,this.endPoint);
|
1675
|
+
ctx.lineTo(linePos,this.startPoint - 3);
|
1676
|
+
ctx.stroke();
|
1677
|
+
ctx.closePath();
|
1678
|
+
}
|
1619
1679
|
|
1620
1680
|
|
1621
1681
|
ctx.lineWidth = this.lineWidth;
|
@@ -1963,6 +2023,12 @@
|
|
1963
2023
|
//Number - Width of the grid lines
|
1964
2024
|
scaleGridLineWidth : 1,
|
1965
2025
|
|
2026
|
+
//Boolean - Whether to show horizontal lines (except X axis)
|
2027
|
+
scaleShowHorizontalLines: true,
|
2028
|
+
|
2029
|
+
//Boolean - Whether to show vertical lines (except Y axis)
|
2030
|
+
scaleShowVerticalLines: true,
|
2031
|
+
|
1966
2032
|
//Boolean - If there is a stroke on each bar
|
1967
2033
|
barShowStroke : true,
|
1968
2034
|
|
@@ -2150,6 +2216,8 @@
|
|
2150
2216
|
font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
|
2151
2217
|
lineWidth : this.options.scaleLineWidth,
|
2152
2218
|
lineColor : this.options.scaleLineColor,
|
2219
|
+
showHorizontalLines : this.options.scaleShowHorizontalLines,
|
2220
|
+
showVerticalLines : this.options.scaleShowVerticalLines,
|
2153
2221
|
gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
|
2154
2222
|
gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
|
2155
2223
|
padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0,
|
@@ -2236,6 +2304,7 @@
|
|
2236
2304
|
|
2237
2305
|
|
2238
2306
|
}).call(this);
|
2307
|
+
|
2239
2308
|
(function(){
|
2240
2309
|
"use strict";
|
2241
2310
|
|
@@ -2438,6 +2507,12 @@
|
|
2438
2507
|
//Number - Width of the grid lines
|
2439
2508
|
scaleGridLineWidth : 1,
|
2440
2509
|
|
2510
|
+
//Boolean - Whether to show horizontal lines (except X axis)
|
2511
|
+
scaleShowHorizontalLines: true,
|
2512
|
+
|
2513
|
+
//Boolean - Whether to show vertical lines (except Y axis)
|
2514
|
+
scaleShowVerticalLines: true,
|
2515
|
+
|
2441
2516
|
//Boolean - Whether the line is curved between points
|
2442
2517
|
bezierCurve : true,
|
2443
2518
|
|
@@ -2612,6 +2687,8 @@
|
|
2612
2687
|
font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
|
2613
2688
|
lineWidth : this.options.scaleLineWidth,
|
2614
2689
|
lineColor : this.options.scaleLineColor,
|
2690
|
+
showHorizontalLines : this.options.scaleShowHorizontalLines,
|
2691
|
+
showVerticalLines : this.options.scaleShowVerticalLines,
|
2615
2692
|
gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
|
2616
2693
|
gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
|
2617
2694
|
padding: (this.options.showScale) ? 0 : this.options.pointDotRadius + this.options.pointDotStrokeWidth,
|
@@ -2786,6 +2863,7 @@
|
|
2786
2863
|
|
2787
2864
|
|
2788
2865
|
}).call(this);
|
2866
|
+
|
2789
2867
|
(function(){
|
2790
2868
|
"use strict";
|
2791
2869
|
|
@@ -3376,4 +3454,4 @@
|
|
3376
3454
|
|
3377
3455
|
|
3378
3456
|
|
3379
|
-
}).call(this);
|
3457
|
+
}).call(this);
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: chartjs-ror
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andy Stewart
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|