chart-horizontalbar-rails 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: e4c2f89f8673414de55c50f6ade1e62fa885c50a
4
+ data.tar.gz: a15999c09342d2494bab965264b97be8c105187f
5
+ SHA512:
6
+ metadata.gz: ac5924345a9daf927f4012ab811f1e65892fb7fe9fadb7ddf7673be1e00e45086cb17d07aa41fa7d873258a94945aa988e935e4d71004ddbc209869e3e595f3a
7
+ data.tar.gz: 15f0a471a0dfbde29638ec453ab9e92bfb1da2eec422f86d1108faeac0523eaa5bb16041afaa7492751d78becff58e309595395c14a262e0b59aa792a4c2c3fc
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Tom Southall
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,15 @@
1
+ # chart-horizontalbar-rails
2
+
3
+ Horizontal Bar Chart plugin for [Chart.js](http://chartjs.org), written by [Tom Southall](https://github.com/tomsouthall), packaged for the Rails asset pipeline.
4
+
5
+ ## Usage
6
+
7
+ Add the following to your JavaScript application manifest:
8
+
9
+ ```
10
+ //= require Chart.HorizontalBar
11
+ ```
12
+
13
+ ## Disclaimer
14
+
15
+ This repo is a Rails gem package. All issues with the library should be reported on the library's [GitHub page](https://github.com/tomsouthall/Chart.HorizontalBar.js). This repo will be updated each time a new version of the library is released.
@@ -0,0 +1,8 @@
1
+ require 'chart-horizontalbar-rails/version'
2
+
3
+ module ChartHorizontalbar
4
+ module Rails
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module ChartHorizontalbar
2
+ module Rails
3
+ VERSION = '1.0.4'
4
+ end
5
+ end
@@ -0,0 +1,504 @@
1
+ (function(){
2
+ "use strict";
3
+
4
+ var root = this,
5
+ Chart = root.Chart,
6
+ helpers = Chart.helpers;
7
+
8
+
9
+ var defaultConfig = {
10
+ //Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value
11
+ scaleBeginAtZero : true,
12
+
13
+ //Boolean - Whether grid lines are shown across the chart
14
+ scaleShowGridLines : true,
15
+
16
+ //String - Colour of the grid lines
17
+ scaleGridLineColor : "rgba(0,0,0,.05)",
18
+
19
+ //Number - Width of the grid lines
20
+ scaleGridLineWidth : 1,
21
+
22
+ //Boolean - Whether to show horizontal lines (except X axis)
23
+ scaleShowHorizontalLines: true,
24
+
25
+ //Boolean - Whether to show vertical lines (except Y axis)
26
+ scaleShowVerticalLines: true,
27
+
28
+ //Boolean - If there is a stroke on each bar
29
+ barShowStroke : true,
30
+
31
+ //Number - Pixel width of the bar stroke
32
+ barStrokeWidth : 2,
33
+
34
+ //Number - Spacing between each of the X value sets
35
+ barValueSpacing : 5,
36
+
37
+ //Number - Spacing between data sets within X values
38
+ barDatasetSpacing : 1,
39
+
40
+ //String - A legend template
41
+ legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<datasets.length; i++){%><li><span style=\"background-color:<%=datasets[i].fillColor%>\"></span><%if(datasets[i].label){%><%=datasets[i].label%><%}%></li><%}%></ul>"
42
+
43
+ };
44
+
45
+ Chart.HorizontalRectangle = Chart.Element.extend({
46
+ draw : function(){
47
+ var ctx = this.ctx,
48
+ halfHeight = this.height/2,
49
+ top = this.y - halfHeight,
50
+ bottom = this.y + halfHeight,
51
+ right = this.left - (this.left - this.x),
52
+ halfStroke = this.strokeWidth / 2;
53
+
54
+ // Canvas doesn't allow us to stroke inside the width so we can
55
+ // adjust the sizes to fit if we're setting a stroke on the line
56
+ if (this.showStroke){
57
+ top += halfStroke;
58
+ bottom -= halfStroke;
59
+ right += halfStroke;
60
+ }
61
+
62
+ ctx.beginPath();
63
+
64
+ ctx.fillStyle = this.fillColor;
65
+ ctx.strokeStyle = this.strokeColor;
66
+ ctx.lineWidth = this.strokeWidth;
67
+
68
+ // It'd be nice to keep this class totally generic to any rectangle
69
+ // and simply specify which border to miss out.
70
+ ctx.moveTo(this.left, top);
71
+ ctx.lineTo(right, top);
72
+ ctx.lineTo(right, bottom);
73
+ ctx.lineTo(this.left, bottom);
74
+ ctx.fill();
75
+ if (this.showStroke){
76
+ ctx.stroke();
77
+ }
78
+ },
79
+ inRange : function(chartX,chartY){
80
+ return (chartX >= this.left && chartX <= this.x && chartY >= (this.y - this.height/2) && chartY <= (this.y + this.height/2));
81
+ }
82
+ });
83
+
84
+ Chart.Type.extend({
85
+ name: "HorizontalBar",
86
+ defaults : defaultConfig,
87
+ initialize: function(data){
88
+
89
+ //Expose options as a scope variable here so we can access it in the ScaleClass
90
+ var options = this.options;
91
+
92
+ this.ScaleClass = Chart.Scale.extend({
93
+ offsetGridLines : true,
94
+ calculateBarX : function(datasetCount, datasetIndex, barIndex){
95
+ //Reusable method for calculating the xPosition of a given bar based on datasetIndex & width of the bar
96
+ var xWidth = this.calculateBaseWidth(),
97
+ xAbsolute = this.calculateX(barIndex) - (xWidth/2),
98
+ barWidth = this.calculateBarWidth(datasetCount);
99
+
100
+ return xAbsolute + (barWidth * datasetIndex) + (datasetIndex * options.barDatasetSpacing) + barWidth/2;
101
+ },
102
+ calculateBaseWidth : function(){
103
+ return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing);
104
+ },
105
+ calculateBarWidth : function(datasetCount){
106
+ //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset
107
+ var baseWidth = this.calculateBaseWidth() - ((datasetCount - 1) * options.barDatasetSpacing);
108
+
109
+ return (baseWidth / datasetCount);
110
+ },
111
+
112
+ calculateBaseHeight : function(){
113
+ return ((this.endPoint - this.startPoint) / this.yLabels.length) - (2*options.barValueSpacing);
114
+ },
115
+ calculateBarHeight : function(datasetCount){
116
+ //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset
117
+ var baseHeight = this.calculateBaseHeight() - ((datasetCount) * options.barDatasetSpacing);
118
+
119
+ return (baseHeight / datasetCount);
120
+ },
121
+
122
+ calculateXInvertXY : function(value) {
123
+ var scalingFactor = (this.width - Math.round(this.xScalePaddingLeft) - this.xScalePaddingRight) / (this.max - this.min);
124
+ return Math.round(this.xScalePaddingLeft) + (scalingFactor * (value - this.min));
125
+ },
126
+
127
+ calculateYInvertXY : function(index){
128
+ return index * ((this.startPoint - this.endPoint) / (this.yLabels.length));
129
+ },
130
+
131
+ calculateBarY : function(datasetCount, datasetIndex, barIndex){
132
+ //Reusable method for calculating the yPosition of a given bar based on datasetIndex & height of the bar
133
+ var yHeight = this.calculateBaseHeight(),
134
+ yAbsolute = (this.endPoint + this.calculateYInvertXY(barIndex) - (yHeight / 2)) - 5,
135
+ barHeight = this.calculateBarHeight(datasetCount);
136
+ if (datasetCount > 1) yAbsolute = yAbsolute + (barHeight * (datasetIndex - 1)) - (datasetIndex * options.barDatasetSpacing) + barHeight/2;
137
+ return yAbsolute;
138
+ },
139
+
140
+ buildCalculatedLabels : function() {
141
+ this.calculatedLabels = [];
142
+
143
+ var stepDecimalPlaces = helpers.getDecimalPlaces(this.stepValue);
144
+
145
+ for (var i=0; i<=this.steps; i++){
146
+ this.calculatedLabels.push(helpers.template(this.templateString,{value:(this.min + (i * this.stepValue)).toFixed(stepDecimalPlaces)}));
147
+ }
148
+ },
149
+
150
+ buildYLabels : function(){
151
+ this.buildYLabelCounter = (typeof this.buildYLabelCounter === 'undefined') ? 0 : this.buildYLabelCounter + 1;
152
+ this.buildCalculatedLabels();
153
+ if(this.buildYLabelCounter === 0) this.yLabels = this.xLabels;
154
+ this.xLabels = this.calculatedLabels;
155
+ this.yLabelWidth = (this.display && this.showLabels) ? helpers.longestText(this.ctx,this.font,this.yLabels) : 0;
156
+ },
157
+
158
+ calculateX : function(index){
159
+ var isRotated = (this.xLabelRotation > 0),
160
+ innerWidth = this.width - (this.xScalePaddingLeft + this.xScalePaddingRight),
161
+ valueWidth = innerWidth/(this.steps - ((this.offsetGridLines) ? 0 : 1)),
162
+ valueOffset = (valueWidth * index) + this.xScalePaddingLeft;
163
+
164
+ if (this.offsetGridLines){
165
+ valueOffset += (valueWidth/2);
166
+ }
167
+
168
+ return Math.round(valueOffset);
169
+ },
170
+
171
+ draw : function(){
172
+ var ctx = this.ctx,
173
+ yLabelGap = (this.endPoint - this.startPoint) / this.yLabels.length,
174
+ xStart = Math.round(this.xScalePaddingLeft);
175
+ if (this.display){
176
+ ctx.fillStyle = this.textColor;
177
+ ctx.font = this.font;
178
+ helpers.each(this.yLabels,function(labelString,index){
179
+ var yLabelCenter = this.endPoint - (yLabelGap * index),
180
+ linePositionY = Math.round(yLabelCenter),
181
+ drawHorizontalLine = this.showHorizontalLines;
182
+
183
+ yLabelCenter -= yLabelGap / 2;
184
+
185
+ ctx.textAlign = "right";
186
+ ctx.textBaseline = "middle";
187
+ if (this.showLabels){
188
+ ctx.fillText(labelString,xStart - 10,yLabelCenter);
189
+ }
190
+
191
+ if (index === 0 && !drawHorizontalLine) {
192
+ drawHorizontalLine = true;
193
+ }
194
+ if (drawHorizontalLine){
195
+ ctx.beginPath();
196
+ }
197
+ if (index > 0){
198
+ // This is a grid line in the centre, so drop that
199
+ ctx.lineWidth = this.gridLineWidth;
200
+ ctx.strokeStyle = this.gridLineColor;
201
+ } else {
202
+ // This is the first line on the scale
203
+ ctx.lineWidth = this.lineWidth;
204
+ ctx.strokeStyle = this.lineColor;
205
+ }
206
+
207
+ linePositionY += helpers.aliasPixel(ctx.lineWidth);
208
+
209
+ if(drawHorizontalLine){
210
+ ctx.moveTo(xStart, linePositionY);
211
+ ctx.lineTo(this.width, linePositionY);
212
+ ctx.stroke();
213
+ ctx.closePath();
214
+ }
215
+
216
+ ctx.lineWidth = this.lineWidth;
217
+ ctx.strokeStyle = this.lineColor;
218
+ ctx.beginPath();
219
+ ctx.moveTo(xStart - 5, linePositionY);
220
+ ctx.lineTo(xStart, linePositionY);
221
+ ctx.stroke();
222
+ ctx.closePath();
223
+
224
+ },this);
225
+
226
+ helpers.each(this.xLabels,function(label,index){
227
+ var width = this.calculateX(1) - this.calculateX(0);
228
+ var xPos = this.calculateX(index) + helpers.aliasPixel(this.lineWidth) - (width / 2),
229
+ // Check to see if line/bar here and decide where to place the line
230
+ linePos = this.calculateX(index - (this.offsetGridLines ? 0.5 : 0)) + helpers.aliasPixel(this.lineWidth),
231
+ isRotated = (this.xLabelRotation > 0);
232
+
233
+ ctx.beginPath();
234
+
235
+ if (index > 0){
236
+ // This is a grid line in the centre, so drop that
237
+ ctx.lineWidth = this.gridLineWidth;
238
+ ctx.strokeStyle = this.gridLineColor;
239
+ } else {
240
+ // This is the first line on the scale
241
+ ctx.lineWidth = this.lineWidth;
242
+ ctx.strokeStyle = this.lineColor;
243
+ }
244
+ ctx.moveTo(linePos,this.endPoint);
245
+ ctx.lineTo(linePos,this.startPoint - 3);
246
+ ctx.stroke();
247
+ ctx.closePath();
248
+
249
+
250
+ ctx.lineWidth = this.lineWidth;
251
+ ctx.strokeStyle = this.lineColor;
252
+
253
+
254
+ // Small lines at the bottom of the base grid line
255
+ ctx.beginPath();
256
+ ctx.moveTo(linePos,this.endPoint);
257
+ ctx.lineTo(linePos,this.endPoint + 5);
258
+ ctx.stroke();
259
+ ctx.closePath();
260
+
261
+ ctx.save();
262
+ ctx.translate(xPos,(isRotated) ? this.endPoint + 12 : this.endPoint + 8);
263
+ ctx.rotate(helpers.radians(this.xLabelRotation)*-1);
264
+ ctx.font = this.font;
265
+ ctx.textAlign = (isRotated) ? "right" : "center";
266
+ ctx.textBaseline = (isRotated) ? "middle" : "top";
267
+ ctx.fillText(label, 0, 0);
268
+ ctx.restore();
269
+ },this);
270
+
271
+ }
272
+ }
273
+
274
+ });
275
+
276
+ this.datasets = [];
277
+
278
+ //Set up tooltip events on the chart
279
+ if (this.options.showTooltips){
280
+ helpers.bindEvents(this, this.options.tooltipEvents, function(evt){
281
+ var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : [];
282
+
283
+ this.eachBars(function(bar){
284
+ bar.restore(['fillColor', 'strokeColor']);
285
+ });
286
+ helpers.each(activeBars, function(activeBar){
287
+ activeBar.fillColor = activeBar.highlightFill;
288
+ activeBar.strokeColor = activeBar.highlightStroke;
289
+ });
290
+ this.showTooltip(activeBars);
291
+ });
292
+ }
293
+
294
+ //Declare the extension of the default point, to cater for the options passed in to the constructor
295
+ this.BarClass = Chart.HorizontalRectangle.extend({
296
+ strokeWidth : this.options.barStrokeWidth,
297
+ showStroke : this.options.barShowStroke,
298
+ ctx : this.chart.ctx
299
+ });
300
+
301
+ //Iterate through each of the datasets, and build this into a property of the chart
302
+ helpers.each(data.datasets,function(dataset,datasetIndex){
303
+
304
+ var datasetObject = {
305
+ label : dataset.label || null,
306
+ fillColor : dataset.fillColor,
307
+ strokeColor : dataset.strokeColor,
308
+ bars : []
309
+ };
310
+
311
+ this.datasets.push(datasetObject);
312
+
313
+ helpers.each(dataset.data,function(dataPoint,index){
314
+ //Add a new point for each piece of data, passing any required data to draw.
315
+ datasetObject.bars.push(new this.BarClass({
316
+ value : dataPoint,
317
+ label : data.labels[index],
318
+ datasetLabel: dataset.label,
319
+ strokeColor : dataset.strokeColor,
320
+ fillColor : dataset.fillColor,
321
+ highlightFill : dataset.highlightFill || dataset.fillColor,
322
+ highlightStroke : dataset.highlightStroke || dataset.strokeColor
323
+ }));
324
+ },this);
325
+
326
+ },this);
327
+
328
+ this.buildScale(data.labels);
329
+
330
+ this.BarClass.prototype.left = Math.round(this.scale.xScalePaddingLeft);
331
+
332
+ this.eachBars(function(bar, index, datasetIndex){
333
+ helpers.extend(bar, {
334
+ x: Math.round(this.scale.xScalePaddingLeft),
335
+ y : this.scale.calculateBarY(this.datasets.length, datasetIndex, index),
336
+ height : this.scale.calculateBarHeight(this.datasets.length)
337
+ });
338
+ bar.save();
339
+ }, this);
340
+
341
+ this.render();
342
+ },
343
+ update : function(){
344
+ this.scale.update();
345
+ // Reset any highlight colours before updating.
346
+ helpers.each(this.activeElements, function(activeElement){
347
+ activeElement.restore(['fillColor', 'strokeColor']);
348
+ });
349
+
350
+ this.eachBars(function(bar){
351
+ bar.save();
352
+ });
353
+ this.render();
354
+ },
355
+ eachBars : function(callback){
356
+ helpers.each(this.datasets,function(dataset, datasetIndex){
357
+ helpers.each(dataset.bars, callback, this, datasetIndex);
358
+ },this);
359
+ },
360
+ getBarsAtEvent : function(e){
361
+ var barsArray = [],
362
+ eventPosition = helpers.getRelativePosition(e),
363
+ datasetIterator = function(dataset){
364
+ barsArray.push(dataset.bars[barIndex]);
365
+ },
366
+ barIndex;
367
+
368
+ for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) {
369
+ for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) {
370
+ if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){
371
+ helpers.each(this.datasets, datasetIterator);
372
+ return barsArray;
373
+ }
374
+ }
375
+ }
376
+
377
+ return barsArray;
378
+ },
379
+ buildScale : function(labels){
380
+ var self = this;
381
+
382
+ var dataTotal = function(){
383
+ var values = [];
384
+ self.eachBars(function(bar){
385
+ values.push(bar.value);
386
+ });
387
+ return values;
388
+ };
389
+
390
+ var scaleOptions = {
391
+ templateString : this.options.scaleLabel,
392
+ height : this.chart.height,
393
+ width : this.chart.width,
394
+ ctx : this.chart.ctx,
395
+ textColor : this.options.scaleFontColor,
396
+ fontSize : this.options.scaleFontSize,
397
+ fontStyle : this.options.scaleFontStyle,
398
+ fontFamily : this.options.scaleFontFamily,
399
+ valuesCount : labels.length,
400
+ beginAtZero : this.options.scaleBeginAtZero,
401
+ integersOnly : this.options.scaleIntegersOnly,
402
+ calculateYRange: function(currentHeight){
403
+ var updatedRanges = helpers.calculateScaleRange(
404
+ dataTotal(),
405
+ currentHeight,
406
+ this.fontSize,
407
+ this.beginAtZero,
408
+ this.integersOnly
409
+ );
410
+ helpers.extend(this, updatedRanges);
411
+ },
412
+ xLabels : labels,
413
+ font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily),
414
+ lineWidth : this.options.scaleLineWidth,
415
+ lineColor : this.options.scaleLineColor,
416
+ showHorizontalLines : this.options.scaleShowHorizontalLines,
417
+ showVerticalLines : this.options.scaleShowVerticalLines,
418
+ gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0,
419
+ gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)",
420
+ padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0,
421
+ showLabels : this.options.scaleShowLabels,
422
+ display : this.options.showScale
423
+ };
424
+
425
+ if (this.options.scaleOverride){
426
+ helpers.extend(scaleOptions, {
427
+ calculateYRange: helpers.noop,
428
+ steps: this.options.scaleSteps,
429
+ stepValue: this.options.scaleStepWidth,
430
+ min: this.options.scaleStartValue,
431
+ max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth)
432
+ });
433
+ }
434
+
435
+ this.scale = new this.ScaleClass(scaleOptions);
436
+ },
437
+ addData : function(valuesArray,label){
438
+ //Map the values array for each of the datasets
439
+ helpers.each(valuesArray,function(value,datasetIndex){
440
+ //Add a new point for each piece of data, passing any required data to draw.
441
+ this.datasets[datasetIndex].bars.push(new this.BarClass({
442
+ value : value,
443
+ label : label,
444
+ x: this.scale.calculateBarX(this.datasets.length, datasetIndex, this.scale.valuesCount+1),
445
+ y: this.scale.endPoint,
446
+ width : this.scale.calculateBarWidth(this.datasets.length),
447
+ base : this.scale.endPoint,
448
+ strokeColor : this.datasets[datasetIndex].strokeColor,
449
+ fillColor : this.datasets[datasetIndex].fillColor
450
+ }));
451
+ },this);
452
+
453
+ this.scale.addXLabel(label);
454
+ //Then re-render the chart.
455
+ this.update();
456
+ },
457
+ removeData : function(){
458
+ this.scale.removeXLabel();
459
+ //Then re-render the chart.
460
+ helpers.each(this.datasets,function(dataset){
461
+ dataset.bars.shift();
462
+ },this);
463
+ this.update();
464
+ },
465
+ reflow : function(){
466
+ helpers.extend(this.BarClass.prototype,{
467
+ y: this.scale.endPoint,
468
+ base : this.scale.endPoint
469
+ });
470
+ var newScaleProps = helpers.extend({
471
+ height : this.chart.height,
472
+ width : this.chart.width
473
+ });
474
+
475
+ this.scale.update(newScaleProps);
476
+ },
477
+ draw : function(ease){
478
+ var easingDecimal = ease || 1;
479
+ this.clear();
480
+
481
+ var ctx = this.chart.ctx;
482
+
483
+ this.scale.draw(easingDecimal);
484
+
485
+ //Draw all the bars for each dataset
486
+ helpers.each(this.datasets,function(dataset,datasetIndex){
487
+ helpers.each(dataset.bars,function(bar,index){
488
+ if (bar.hasValue()){
489
+ bar.left = Math.round(this.scale.xScalePaddingLeft);
490
+ //Transition then draw
491
+ bar.transition({
492
+ x : this.scale.calculateXInvertXY(bar.value),
493
+ y : this.scale.calculateBarY(this.datasets.length, datasetIndex, index),
494
+ height : this.scale.calculateBarHeight(this.datasets.length)
495
+ }, easingDecimal).draw();
496
+ }
497
+ },this);
498
+
499
+ },this);
500
+ }
501
+ });
502
+
503
+
504
+ }).call(this);
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chart-horizontalbar-rails
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.4
5
+ platform: ruby
6
+ authors:
7
+ - Curt Howard
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-02-14 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: A build of the Chart.js Horizontal Bar plugin, written by Tom Southall,
14
+ packaged for the Rails asset pipeline.
15
+ email:
16
+ - choward@weblinc.com
17
+ executables: []
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - LICENSE
22
+ - README.md
23
+ - lib/chart-horizontalbar-rails.rb
24
+ - lib/chart-horizontalbar-rails/version.rb
25
+ - vendor/assets/javascripts/Chart.HorizontalBar.js
26
+ homepage: https://github.com/meowsus/chart-horizontalbar-rails
27
+ licenses:
28
+ - MIT
29
+ metadata: {}
30
+ post_install_message:
31
+ rdoc_options: []
32
+ require_paths:
33
+ - lib
34
+ required_ruby_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ required_rubygems_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ requirements: []
45
+ rubyforge_project:
46
+ rubygems_version: 2.4.5
47
+ signing_key:
48
+ specification_version: 4
49
+ summary: A build of the Chart.js Horizontal Bar plugin, written by Tom Southall, packaged
50
+ for the Rails asset pipeline.
51
+ test_files: []