highcharts-rails 3.0.2 → 3.0.3
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 +15 -0
- checksums.yaml.gz.asc +18 -0
- data/CHANGELOG.markdown +4 -0
- data/Rakefile +29 -1
- data/app/assets/javascripts/highcharts/adapters/mootools.js +1 -1
- data/app/assets/javascripts/highcharts/adapters/prototype.js +1 -1
- data/app/assets/javascripts/highcharts/highcharts-more.js +118 -217
- data/app/assets/javascripts/highcharts/modules/annotations.js +74 -27
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +1 -1
- data/app/assets/javascripts/highcharts/modules/data.js +74 -29
- data/app/assets/javascripts/highcharts/modules/exporting.js +5 -8
- data/app/assets/javascripts/highcharts/modules/funnel.js +2 -2
- data/app/assets/javascripts/highcharts/modules/heatmap.js +57 -0
- data/app/assets/javascripts/highcharts/modules/map.js +576 -0
- data/app/assets/javascripts/highcharts.js +853 -497
- data/highcharts-rails.gemspec +1 -0
- data/lib/highcharts/version.rb +1 -1
- data.tar.gz.asc +14 -14
- metadata +18 -23
- metadata.gz.asc +14 -14
@@ -5,26 +5,7 @@ var UNDEFINED,
|
|
5
5
|
ALLOWED_SHAPES,
|
6
6
|
Chart = Highcharts.Chart,
|
7
7
|
extend = Highcharts.extend,
|
8
|
-
each = Highcharts.each
|
9
|
-
defaultOptions;
|
10
|
-
|
11
|
-
defaultOptions = {
|
12
|
-
xAxis: 0,
|
13
|
-
yAxis: 0,
|
14
|
-
title: {
|
15
|
-
style: {},
|
16
|
-
text: "",
|
17
|
-
x: 0,
|
18
|
-
y: 0
|
19
|
-
},
|
20
|
-
shape: {
|
21
|
-
params: {
|
22
|
-
stroke: "#000000",
|
23
|
-
fill: "transparent",
|
24
|
-
strokeWidth: 2
|
25
|
-
}
|
26
|
-
}
|
27
|
-
};
|
8
|
+
each = Highcharts.each;
|
28
9
|
|
29
10
|
ALLOWED_SHAPES = ["path", "rect", "circle"];
|
30
11
|
|
@@ -42,6 +23,44 @@ ALIGN_FACTOR = {
|
|
42
23
|
var inArray = HighchartsAdapter.inArray,
|
43
24
|
merge = Highcharts.merge;
|
44
25
|
|
26
|
+
function defaultOptions(shapeType) {
|
27
|
+
var shapeOptions,
|
28
|
+
options;
|
29
|
+
|
30
|
+
options = {
|
31
|
+
xAxis: 0,
|
32
|
+
yAxis: 0,
|
33
|
+
title: {
|
34
|
+
style: {},
|
35
|
+
text: "",
|
36
|
+
x: 0,
|
37
|
+
y: 0
|
38
|
+
},
|
39
|
+
shape: {
|
40
|
+
params: {
|
41
|
+
stroke: "#000000",
|
42
|
+
fill: "transparent",
|
43
|
+
strokeWidth: 2
|
44
|
+
}
|
45
|
+
}
|
46
|
+
};
|
47
|
+
|
48
|
+
shapeOptions = {
|
49
|
+
circle: {
|
50
|
+
params: {
|
51
|
+
x: 0,
|
52
|
+
y: 0
|
53
|
+
}
|
54
|
+
}
|
55
|
+
};
|
56
|
+
|
57
|
+
if (shapeOptions[shapeType]) {
|
58
|
+
options.shape = merge(options.shape, shapeOptions[shapeType]);
|
59
|
+
}
|
60
|
+
|
61
|
+
return options;
|
62
|
+
}
|
63
|
+
|
45
64
|
function isArray(obj) {
|
46
65
|
return Object.prototype.toString.call(obj) === '[object Array]';
|
47
66
|
}
|
@@ -54,6 +73,23 @@ function defined(obj) {
|
|
54
73
|
return obj !== UNDEFINED && obj !== null;
|
55
74
|
}
|
56
75
|
|
76
|
+
function translatePath(d, xAxis, yAxis, xOffset, yOffset) {
|
77
|
+
var len = d.length,
|
78
|
+
i = 0;
|
79
|
+
|
80
|
+
while (i < len) {
|
81
|
+
if (typeof d[i] === 'number' && typeof d[i + 1] === 'number') {
|
82
|
+
d[i] = xAxis.toPixels(d[i]) - xOffset;
|
83
|
+
d[i + 1] = yAxis.toPixels(d[i + 1]) - yOffset;
|
84
|
+
i += 2;
|
85
|
+
} else {
|
86
|
+
i += 1;
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
return d;
|
91
|
+
}
|
92
|
+
|
57
93
|
|
58
94
|
// Define annotation prototype
|
59
95
|
var Annotation = function () {
|
@@ -64,8 +100,10 @@ Annotation.prototype = {
|
|
64
100
|
* Initialize the annotation
|
65
101
|
*/
|
66
102
|
init: function (chart, options) {
|
103
|
+
var shapeType = options.shape && options.shape.type;
|
104
|
+
|
67
105
|
this.chart = chart;
|
68
|
-
this.options = merge({}, defaultOptions, options);
|
106
|
+
this.options = merge({}, defaultOptions(shapeType), options);
|
69
107
|
},
|
70
108
|
|
71
109
|
/*
|
@@ -86,16 +124,17 @@ Annotation.prototype = {
|
|
86
124
|
group = annotation.group = renderer.g();
|
87
125
|
}
|
88
126
|
|
89
|
-
if (!title && titleOptions) {
|
90
|
-
title = annotation.title = renderer.label(titleOptions);
|
91
|
-
title.add(group);
|
92
|
-
}
|
93
127
|
|
94
128
|
if (!shape && shapeOptions && inArray(shapeOptions.type, ALLOWED_SHAPES) !== -1) {
|
95
129
|
shape = annotation.shape = renderer[options.shape.type](shapeOptions.params);
|
96
130
|
shape.add(group);
|
97
131
|
}
|
98
132
|
|
133
|
+
if (!title && titleOptions) {
|
134
|
+
title = annotation.title = renderer.label(titleOptions);
|
135
|
+
title.add(group);
|
136
|
+
}
|
137
|
+
|
99
138
|
group.add(chart.annotations.group);
|
100
139
|
|
101
140
|
// link annotations to point or series
|
@@ -152,10 +191,9 @@ Annotation.prototype = {
|
|
152
191
|
|
153
192
|
|
154
193
|
// Based on given options find annotation pixel position
|
155
|
-
x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) : options.x)
|
194
|
+
x = (defined(options.xValue) ? xAxis.toPixels(options.xValue + xAxis.minPointOffset) - xAxis.minPixelPadding : options.x);
|
156
195
|
y = defined(options.yValue) ? yAxis.toPixels(options.yValue) : options.y;
|
157
196
|
|
158
|
-
|
159
197
|
if (isNaN(x) || isNaN(y) || !isNumber(x) || !isNumber(y)) {
|
160
198
|
return;
|
161
199
|
}
|
@@ -187,6 +225,15 @@ Annotation.prototype = {
|
|
187
225
|
shapeParams.x += xAxis.minPixelPadding;
|
188
226
|
}
|
189
227
|
|
228
|
+
if (options.shape.type === 'path') {
|
229
|
+
translatePath(shapeParams.d, xAxis, yAxis, x, y);
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
// move the center of the circle to shape x/y
|
234
|
+
if (options.shape.type === 'circle') {
|
235
|
+
shapeParams.x += shapeParams.r;
|
236
|
+
shapeParams.y += shapeParams.r;
|
190
237
|
}
|
191
238
|
|
192
239
|
resetBBox = true;
|
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
|
|
2908
2908
|
});
|
2909
2909
|
}
|
2910
2910
|
}/**
|
2911
|
-
* @license Highcharts JS v3.0.
|
2911
|
+
* @license Highcharts JS v3.0.3 (2013-07-31)
|
2912
2912
|
* CanVGRenderer Extension module
|
2913
2913
|
*
|
2914
2914
|
* (c) 2011-2012 Torstein Hønsi, Erik Olsson
|
@@ -2,7 +2,7 @@
|
|
2
2
|
* @license Data plugin for Highcharts
|
3
3
|
*
|
4
4
|
* (c) 2012-2013 Torstein Hønsi
|
5
|
-
* Last revision
|
5
|
+
* Last revision 2013-06-07
|
6
6
|
*
|
7
7
|
* License: www.highcharts.com/license
|
8
8
|
*/
|
@@ -87,8 +87,8 @@
|
|
87
87
|
|
88
88
|
|
89
89
|
// The Data constructor
|
90
|
-
var Data = function (
|
91
|
-
this.init(
|
90
|
+
var Data = function (dataOptions, chartOptions) {
|
91
|
+
this.init(dataOptions, chartOptions);
|
92
92
|
};
|
93
93
|
|
94
94
|
// Set the prototype properties
|
@@ -97,8 +97,9 @@
|
|
97
97
|
/**
|
98
98
|
* Initialize the Data object with the given options
|
99
99
|
*/
|
100
|
-
init: function (options) {
|
100
|
+
init: function (options, chartOptions) {
|
101
101
|
this.options = options;
|
102
|
+
this.chartOptions = chartOptions;
|
102
103
|
this.columns = options.columns || this.rowsToColumns(options.rows) || [];
|
103
104
|
|
104
105
|
// No need to parse or interpret anything
|
@@ -120,6 +121,30 @@
|
|
120
121
|
|
121
122
|
},
|
122
123
|
|
124
|
+
/**
|
125
|
+
* Get the column distribution. For example, a line series takes a single column for
|
126
|
+
* Y values. A range series takes two columns for low and high values respectively,
|
127
|
+
* and an OHLC series takes four columns.
|
128
|
+
*/
|
129
|
+
getColumnDistribution: function () {
|
130
|
+
var chartOptions = this.chartOptions,
|
131
|
+
getValueCount = function (type) {
|
132
|
+
return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length;
|
133
|
+
},
|
134
|
+
globalType = chartOptions && chartOptions.chart && chartOptions.chart.type,
|
135
|
+
individualCounts = [];
|
136
|
+
|
137
|
+
each((chartOptions && chartOptions.series) || [], function (series) {
|
138
|
+
individualCounts.push(getValueCount(series.type || globalType));
|
139
|
+
});
|
140
|
+
|
141
|
+
this.valueCount = {
|
142
|
+
global: getValueCount(globalType),
|
143
|
+
individual: individualCounts
|
144
|
+
};
|
145
|
+
},
|
146
|
+
|
147
|
+
|
123
148
|
dataFound: function () {
|
124
149
|
// Interpret the values into right types
|
125
150
|
this.parseTypes();
|
@@ -436,19 +461,20 @@
|
|
436
461
|
complete: function () {
|
437
462
|
|
438
463
|
var columns = this.columns,
|
439
|
-
hasXData,
|
440
|
-
categories,
|
441
464
|
firstCol,
|
442
465
|
type,
|
443
466
|
options = this.options,
|
467
|
+
valueCount,
|
444
468
|
series,
|
445
469
|
data,
|
446
|
-
name,
|
447
470
|
i,
|
448
|
-
j
|
471
|
+
j,
|
472
|
+
seriesIndex;
|
449
473
|
|
450
474
|
|
451
475
|
if (options.complete) {
|
476
|
+
|
477
|
+
this.getColumnDistribution();
|
452
478
|
|
453
479
|
// Use first column for X data or categories?
|
454
480
|
if (columns.length > 1) {
|
@@ -457,42 +483,61 @@
|
|
457
483
|
firstCol.shift(); // remove the first cell
|
458
484
|
}
|
459
485
|
|
460
|
-
// Use the first column for categories or X values
|
461
|
-
hasXData = firstCol.isNumeric || firstCol.isDatetime;
|
462
|
-
if (!hasXData) { // means type is neither datetime nor linear
|
463
|
-
categories = firstCol;
|
464
|
-
}
|
465
486
|
|
466
487
|
if (firstCol.isDatetime) {
|
467
488
|
type = 'datetime';
|
489
|
+
} else if (!firstCol.isNumeric) {
|
490
|
+
type = 'category';
|
468
491
|
}
|
469
492
|
}
|
470
|
-
|
471
|
-
//
|
472
|
-
series = [];
|
493
|
+
|
494
|
+
// Get the names and shift the top row
|
473
495
|
for (i = 0; i < columns.length; i++) {
|
474
496
|
if (this.headerRow === 0) {
|
475
|
-
name = columns[i].shift();
|
497
|
+
columns[i].name = columns[i].shift();
|
476
498
|
}
|
499
|
+
}
|
500
|
+
|
501
|
+
// Use the next columns for series
|
502
|
+
series = [];
|
503
|
+
for (i = 0, seriesIndex = 0; i < columns.length; seriesIndex++) {
|
504
|
+
|
505
|
+
// This series' value count
|
506
|
+
valueCount = Highcharts.pick(this.valueCount.individual[seriesIndex], this.valueCount.global);
|
507
|
+
|
508
|
+
// Iterate down the cells of each column and add data to the series
|
477
509
|
data = [];
|
478
510
|
for (j = 0; j < columns[i].length; j++) {
|
479
|
-
data[j] =
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
null;
|
511
|
+
data[j] = [
|
512
|
+
firstCol[j],
|
513
|
+
columns[i][j] !== undefined ? columns[i][j] : null
|
514
|
+
];
|
515
|
+
if (valueCount > 1) {
|
516
|
+
data[j].push(columns[i + 1][j] !== undefined ? columns[i + 1][j] : null);
|
517
|
+
}
|
518
|
+
if (valueCount > 2) {
|
519
|
+
data[j].push(columns[i + 2][j] !== undefined ? columns[i + 2][j] : null);
|
520
|
+
}
|
521
|
+
if (valueCount > 3) {
|
522
|
+
data[j].push(columns[i + 3][j] !== undefined ? columns[i + 3][j] : null);
|
523
|
+
}
|
524
|
+
if (valueCount > 4) {
|
525
|
+
data[j].push(columns[i + 4][j] !== undefined ? columns[i + 4][j] : null);
|
526
|
+
}
|
485
527
|
}
|
486
|
-
|
487
|
-
|
528
|
+
|
529
|
+
// Add the series
|
530
|
+
series[seriesIndex] = {
|
531
|
+
name: columns[i].name,
|
488
532
|
data: data
|
489
533
|
};
|
534
|
+
|
535
|
+
i += valueCount;
|
490
536
|
}
|
491
537
|
|
492
538
|
// Do the callback
|
493
539
|
options.complete({
|
494
540
|
xAxis: {
|
495
|
-
categories: categories,
|
496
541
|
type: type
|
497
542
|
},
|
498
543
|
series: series
|
@@ -503,8 +548,8 @@
|
|
503
548
|
|
504
549
|
// Register the Data prototype and data function on Highcharts
|
505
550
|
Highcharts.Data = Data;
|
506
|
-
Highcharts.data = function (options) {
|
507
|
-
return new Data(options);
|
551
|
+
Highcharts.data = function (options, chartOptions) {
|
552
|
+
return new Data(options, chartOptions);
|
508
553
|
};
|
509
554
|
|
510
555
|
// Extend Chart.init so that the Chart constructor accepts a new configuration
|
@@ -528,7 +573,7 @@
|
|
528
573
|
|
529
574
|
proceed.call(chart, userOptions, callback);
|
530
575
|
}
|
531
|
-
}));
|
576
|
+
}), userOptions);
|
532
577
|
} else {
|
533
578
|
proceed.call(chart, userOptions, callback);
|
534
579
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v3.0.
|
2
|
+
* @license Highcharts JS v3.0.3 (2013-07-31)
|
3
3
|
* Exporting module
|
4
4
|
*
|
5
5
|
* (c) 2010-2013 Torstein Hønsi
|
@@ -269,7 +269,7 @@ extend(Chart.prototype, {
|
|
269
269
|
userMin = extremes.userMin,
|
270
270
|
userMax = extremes.userMax;
|
271
271
|
|
272
|
-
if (userMin !== UNDEFINED || userMax !== UNDEFINED) {
|
272
|
+
if (axisCopy && (userMin !== UNDEFINED || userMax !== UNDEFINED)) {
|
273
273
|
axisCopy.setExtremes(userMin, userMax, true, false);
|
274
274
|
}
|
275
275
|
});
|
@@ -319,9 +319,6 @@ extend(Chart.prototype, {
|
|
319
319
|
// IE9 beta bugs with innerHTML. Test again with final IE9.
|
320
320
|
svg = svg.replace(/(url\(#highcharts-[0-9]+)"/g, '$1')
|
321
321
|
.replace(/"/g, "'");
|
322
|
-
if (svg.match(/ xmlns="/g).length === 2) {
|
323
|
-
svg = svg.replace(/xmlns="[^"]+"/, '');
|
324
|
-
}
|
325
322
|
|
326
323
|
return svg;
|
327
324
|
},
|
@@ -342,8 +339,8 @@ extend(Chart.prototype, {
|
|
342
339
|
chartOptions,
|
343
340
|
{
|
344
341
|
exporting: {
|
345
|
-
sourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth,
|
346
|
-
sourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight
|
342
|
+
sourceWidth: options.sourceWidth || chartExportingOptions.sourceWidth,
|
343
|
+
sourceHeight: options.sourceHeight || chartExportingOptions.sourceHeight
|
347
344
|
}
|
348
345
|
}
|
349
346
|
));
|
@@ -519,7 +516,7 @@ extend(Chart.prototype, {
|
|
519
516
|
menuStyle.left = (x - menuPadding) + PX;
|
520
517
|
}
|
521
518
|
// if outside bottom, bottom align it
|
522
|
-
if (y + height + chart.exportMenuHeight > chartHeight) {
|
519
|
+
if (y + height + chart.exportMenuHeight > chartHeight && button.alignOptions.verticalAlign !== 'top') {
|
523
520
|
menuStyle.bottom = (chartHeight - y - menuPadding) + PX;
|
524
521
|
} else {
|
525
522
|
menuStyle.top = (y + height - menuPadding) + PX;
|
@@ -94,7 +94,7 @@ seriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, {
|
|
94
94
|
|
95
95
|
// Return the width at a specific y coordinate
|
96
96
|
series.getWidthAt = getWidthAt = function (y) {
|
97
|
-
return y > height - neckHeight ?
|
97
|
+
return y > height - neckHeight || height === neckHeight ?
|
98
98
|
neckWidth :
|
99
99
|
neckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight));
|
100
100
|
};
|
@@ -137,7 +137,7 @@ seriesTypes.funnel = Highcharts.extendClass(seriesTypes.pie, {
|
|
137
137
|
// set start and end positions
|
138
138
|
y5 = null;
|
139
139
|
fraction = sum ? point.y / sum : 0;
|
140
|
-
y1 = cumulative * height;
|
140
|
+
y1 = centerY - height / 2 + cumulative * height;
|
141
141
|
y3 = y1 + fraction * height;
|
142
142
|
//tempWidth = neckWidth + (width - neckWidth) * ((height - neckHeight - y1) / (height - neckHeight));
|
143
143
|
tempWidth = getWidthAt(y1);
|
@@ -0,0 +1,57 @@
|
|
1
|
+
(function (Highcharts) {
|
2
|
+
var seriesTypes = Highcharts.seriesTypes,
|
3
|
+
each = Highcharts.each;
|
4
|
+
|
5
|
+
seriesTypes.heatmap = Highcharts.extendClass(seriesTypes.map, {
|
6
|
+
colorKey: 'z',
|
7
|
+
pointArrayMap: ['y', 'z'],
|
8
|
+
translate: function () {
|
9
|
+
var series = this,
|
10
|
+
options = series.options,
|
11
|
+
dataMin = Number.MAX_VALUE,
|
12
|
+
dataMax = Number.MIN_VALUE,
|
13
|
+
opacity,
|
14
|
+
minOpacity = options.minOpacity,
|
15
|
+
path,
|
16
|
+
color;
|
17
|
+
|
18
|
+
|
19
|
+
series.generatePoints();
|
20
|
+
|
21
|
+
each(series.data, function (point) {
|
22
|
+
var x = point.x,
|
23
|
+
y = point.y,
|
24
|
+
value = point.z,
|
25
|
+
xPad = (series.options.colsize || 1) / 2,
|
26
|
+
yPad = (series.options.rowsize || 1) / 2;
|
27
|
+
|
28
|
+
point.path = [
|
29
|
+
'M', x - xPad, y - yPad,
|
30
|
+
'L', x + xPad, y - yPad,
|
31
|
+
'L', x + xPad, y + yPad,
|
32
|
+
'L', x - xPad, y + yPad,
|
33
|
+
'Z'
|
34
|
+
];
|
35
|
+
|
36
|
+
point.shapeType = 'path';
|
37
|
+
point.shapeArgs = {
|
38
|
+
d: series.translatePath(point.path)
|
39
|
+
};
|
40
|
+
|
41
|
+
if (typeof value === 'number') {
|
42
|
+
if (value > dataMax) {
|
43
|
+
dataMax = value;
|
44
|
+
} else if (value < dataMin) {
|
45
|
+
dataMin = value;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
});
|
49
|
+
|
50
|
+
series.translateColors(dataMin, dataMax);
|
51
|
+
},
|
52
|
+
|
53
|
+
getBox: function () {}
|
54
|
+
|
55
|
+
});
|
56
|
+
|
57
|
+
}(Highcharts));
|