chartjs-ror 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 490a1e2096ba372b3b63863ed43e1d34e86e1711
4
- data.tar.gz: ce920b4b25c2eb11a82355c88bf5b664ca653a2b
3
+ metadata.gz: 6f2ebce780d9ca9649f2b1fcd39b5fa6fa09db3b
4
+ data.tar.gz: 1363a9862e86500e3387284e7e43d95ba3cb91be
5
5
  SHA512:
6
- metadata.gz: d44fae07c64815ef874576c58e42ec99e69468bcb4d2b66fecd5c09723e17afb44502b0cf64083952dce1902a8929807e4b52a94d582c04baaedb67db2eb8d3c
7
- data.tar.gz: 4eca5a3f71a5d620de2ee519312fd5cf838844dd44b1933daa8b551b33688c199b7a0752f65fb48ec75e7c5365149986993a8e121fe4f4c461bd73532fd68070
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 labels, datasets, options %>
40
- <%= bar_chart labels, datasets, options %>
41
- <%= radar_chart labels, datasets, options %>
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
- labels : ["January","February","March","April","May","June","July"],
49
- datasets : [
50
- {
51
- fillColor : "rgba(220,220,220,0.5)",
52
- strokeColor : "rgba(220,220,220,1)",
53
- pointColor : "rgba(220,220,220,1)",
54
- pointStrokeColor : "#fff",
55
- data : [65,59,90,81,56,55,40]
56
- },
57
- {
58
- fillColor : "rgba(151,187,205,0.5)",
59
- strokeColor : "rgba(151,187,205,1)",
60
- pointColor : "rgba(151,187,205,1)",
61
- pointStrokeColor : "#fff",
62
- data : [28,48,40,19,96,27,100]
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
- @data = {
74
- labels: ["January","February","March","April","May","June","July"],
75
- datasets: [
76
- {
77
- fillColor: "rgba(220,220,220,0.5)",
78
- strokeColor: "rgba(220,220,220,1)",
79
- pointColor: "rgba(220,220,220,1)",
80
- pointStrokeColor: "#fff",
81
- data: [65,59,90,81,56,55,40]
82
- },
83
- {
84
- fillColor: "rgba(151,187,205,0.5)",
85
- strokeColor: "rgba(151,187,205,1)",
86
- pointColor: "rgba(151,187,205,1)",
87
- pointStrokeColor: "#fff",
88
- data: [28,48,40,19,96,27,100]
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
- @options = {}
93
- <%= line_chart @data, @options %>
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` - class of the enclosing `<figure/>` - default is `chart`.
173
- * `:element_id` - id of the `<canvas/>` - default is `chart-n` where `n` is the 0-based index of the chart on the page.
174
- * `:width` - width of the canvas in px - default is `400`.
175
- * `:height` - height of the canvas in px - default is `400`.
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
- if (legend.trim().length > 0) {
199
- var legendHolder = document.createElement("div");
200
- legendHolder.innerHTML = legend;
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('load', initChart, false);
146
+ window.addEventListener("load", initChart, false);
147
+ document.addEventListener("page:load", initChart, false);
206
148
  }
207
149
  else if (window.attachEvent) {
208
- window.attachEvent('onload', initChart);
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 exampe:
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
- A legend will be rendered using `chart.generateLegend()` ([docs][advanced]).
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
- def line_chart(labels, datasets, options = {})
5
- chart 'Line', labels, datasets, options
6
- end
7
-
8
- def bar_chart(labels, datasets, options = {})
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, labels, datasets, options)
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(datasets))
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 = #{data_for labels, datasets};
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
- var legend = chart.generateLegend();
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 data_for(labels, datasets)
82
- if labels
83
- "{labels: #{labels.to_json}, datasets: #{datasets.to_json}}"
69
+ def combined_data(data)
70
+ if data.is_a? Array
71
+ data.map { |datum| datum[:value] }
84
72
  else
85
- datasets.to_json
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
@@ -1,3 +1,3 @@
1
1
  module Chartjs
2
- VERSION = "2.0.0"
2
+ VERSION = "2.1.0"
3
3
  end
@@ -1,9 +1,9 @@
1
1
  /*!
2
2
  * Chart.js
3
3
  * http://chartjs.org/
4
- * Version: 1.0.1-beta.4
4
+ * Version: 1.0.1
5
5
  *
6
- * Copyright 2014 Nick Downie
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
- // Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container
96
- maintainAspectRatio: true,
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
- // If templateString is function rather than string-template - call the function for valuesObject
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 = this.chart.height = newHeight;
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
- switch(this.yAlign)
1276
- {
1277
- case "above":
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
- switch(this.xAlign)
1299
- {
1300
- case "left":
1301
- tooltipX = this.x - tooltipWidth + (this.cornerRadius + this.caretHeight);
1302
- break;
1303
- case "right":
1304
- tooltipX = this.x - (this.cornerRadius + this.caretHeight);
1305
- break;
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
- drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius);
1338
+ drawRoundedRectangle(ctx,tooltipX,tooltipY,tooltipWidth,tooltipRectHeight,this.cornerRadius);
1309
1339
 
1310
- ctx.fill();
1340
+ ctx.fill();
1311
1341
 
1312
- ctx.fillStyle = this.textColor;
1313
- ctx.textAlign = "center";
1314
- ctx.textBaseline = "middle";
1315
- ctx.fillText(this.text, tooltipX + tooltipWidth/2, tooltipY + tooltipRectHeight/2);
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
- drawRoundedRectangle(this.ctx,this.x,this.y - this.height/2,this.width,this.height,this.cornerRadius);
1370
- var ctx = this.ctx;
1371
- ctx.fillStyle = this.fillColor;
1372
- ctx.fill();
1373
- ctx.closePath();
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
- ctx.textAlign = "left";
1376
- ctx.textBaseline = "middle";
1377
- ctx.fillStyle = this.titleTextColor;
1378
- ctx.font = this.titleFont;
1411
+ ctx.textAlign = "left";
1412
+ ctx.textBaseline = "middle";
1413
+ ctx.fillStyle = this.titleTextColor;
1414
+ ctx.font = this.titleFont;
1379
1415
 
1380
- ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0));
1416
+ ctx.fillText(this.title,this.x + this.xPadding, this.getLineHeight(0));
1381
1417
 
1382
- ctx.font = this.font;
1383
- helpers.each(this.labels,function(label,index){
1384
- ctx.fillStyle = this.textColor;
1385
- ctx.fillText(label,this.x + this.xPadding + this.fontSize + 3, this.getLineHeight(index + 1));
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
- //A bit gnarly, but clearing this rectangle breaks when using explorercanvas (clears whole canvas)
1388
- //ctx.clearRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
1389
- //Instead we'll make a white filled block to put the legendColour palette over.
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
- ctx.fillStyle = this.legendColorBackground;
1392
- ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
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
- ctx.fillStyle = this.legendColors[index].fill;
1395
- ctx.fillRect(this.x + this.xPadding, this.getLineHeight(index + 1) - this.fontSize/2, this.fontSize, this.fontSize);
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
- },this);
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
- ctx.beginPath();
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
- ctx.moveTo(xStart, linePositionY);
1584
- ctx.lineTo(this.width, linePositionY);
1585
- ctx.stroke();
1586
- ctx.closePath();
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
- ctx.beginPath();
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
- ctx.moveTo(linePos,this.endPoint);
1616
- ctx.lineTo(linePos,this.startPoint - 3);
1617
- ctx.stroke();
1618
- ctx.closePath();
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.0.0
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: 2014-11-07 00:00:00.000000000 Z
11
+ date: 2015-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails