highcharts-rails 4.1.4 → 4.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.markdown +46 -0
- data/app/assets/javascripts/highcharts.js +165 -116
- data/app/assets/javascripts/highcharts/adapters/standalone-framework.js +1 -1
- data/app/assets/javascripts/highcharts/highcharts-3d.js +8 -5
- data/app/assets/javascripts/highcharts/highcharts-more.js +49 -31
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +1 -1
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +1 -1
- data/app/assets/javascripts/highcharts/modules/data.js +1 -1
- data/app/assets/javascripts/highcharts/modules/drilldown.js +110 -55
- data/app/assets/javascripts/highcharts/modules/exporting.js +2 -2
- data/app/assets/javascripts/highcharts/modules/heatmap.js +15 -8
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +1 -1
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +29 -16
- data/app/assets/javascripts/highcharts/modules/treemap.js +3 -1
- data/lib/highcharts/version.rb +1 -1
- metadata +2 -2
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.1.
|
5
|
+
* @license Highcharts JS v4.1.5 (2015-04-13)
|
6
6
|
*
|
7
7
|
* (c) 2009-2013 Torstein Hønsi
|
8
8
|
*
|
@@ -849,7 +849,9 @@ Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (
|
|
849
849
|
tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], chart, false)[0];
|
850
850
|
point.tooltipPos = [tooltipPos.x, tooltipPos.y];
|
851
851
|
}
|
852
|
-
});
|
852
|
+
});
|
853
|
+
// store for later use #4067
|
854
|
+
series.z = z;
|
853
855
|
});
|
854
856
|
|
855
857
|
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'animate', function (proceed) {
|
@@ -929,14 +931,15 @@ function draw3DPoints(proceed) {
|
|
929
931
|
// Do not do this if the chart is not 3D
|
930
932
|
if (this.chart.is3d()) {
|
931
933
|
var grouping = this.chart.options.plotOptions.column.grouping;
|
932
|
-
if (grouping !== undefined && !grouping && this.group.zIndex !== undefined) {
|
934
|
+
if (grouping !== undefined && !grouping && this.group.zIndex !== undefined && !this.zIndexSet) {
|
933
935
|
this.group.attr({zIndex : (this.group.zIndex * 10)});
|
936
|
+
this.zIndexSet = true; // #4062 set zindex only once
|
934
937
|
}
|
935
938
|
|
936
939
|
var options = this.options,
|
937
940
|
states = this.options.states;
|
938
941
|
|
939
|
-
this.borderWidth = options.borderWidth = options.edgeWidth
|
942
|
+
this.borderWidth = options.borderWidth = defined(options.edgeWidth) ? options.edgeWidth : 1; //#4055
|
940
943
|
|
941
944
|
Highcharts.each(this.data, function (point) {
|
942
945
|
if (point.y !== null) {
|
@@ -965,7 +968,7 @@ Highcharts.wrap(Highcharts.Series.prototype, 'alignDataLabel', function (proceed
|
|
965
968
|
var args = arguments,
|
966
969
|
alignTo = args[4];
|
967
970
|
|
968
|
-
var pos = ({x: alignTo.x, y: alignTo.y, z:
|
971
|
+
var pos = ({x: alignTo.x, y: alignTo.y, z: series.z});
|
969
972
|
pos = perspective([pos], chart, true)[0];
|
970
973
|
alignTo.x = pos.x;
|
971
974
|
alignTo.y = pos.y;
|
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.1.
|
5
|
+
* @license Highcharts JS v4.1.5 (2015-04-13)
|
6
6
|
*
|
7
7
|
* (c) 2009-2014 Torstein Honsi
|
8
8
|
*
|
@@ -1563,8 +1563,6 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1563
1563
|
|
1564
1564
|
upColorProp: 'fill',
|
1565
1565
|
|
1566
|
-
pointArrayMap: ['low', 'y'],
|
1567
|
-
|
1568
1566
|
pointValKey: 'y',
|
1569
1567
|
|
1570
1568
|
/**
|
@@ -1639,6 +1637,11 @@ seriesTypes.waterfall = extendClass(seriesTypes.column, {
|
|
1639
1637
|
}
|
1640
1638
|
previousY += yValue;
|
1641
1639
|
}
|
1640
|
+
// #3952 Negative sum or intermediate sum not rendered correctly
|
1641
|
+
if (shapeArgs.height < 0) {
|
1642
|
+
shapeArgs.y += shapeArgs.height;
|
1643
|
+
shapeArgs.height *= -1;
|
1644
|
+
}
|
1642
1645
|
|
1643
1646
|
point.plotY = shapeArgs.y = mathRound(shapeArgs.y) - (series.borderWidth % 2) / 2;
|
1644
1647
|
shapeArgs.height = mathMax(mathRound(shapeArgs.height), 0.001); // #3151
|
@@ -2141,7 +2144,10 @@ Axis.prototype.beforePadding = function () {
|
|
2141
2144
|
pointerProto = Pointer.prototype,
|
2142
2145
|
colProto;
|
2143
2146
|
|
2144
|
-
|
2147
|
+
/**
|
2148
|
+
* Search a k-d tree by the point angle, used for shared tooltips in polar charts
|
2149
|
+
*/
|
2150
|
+
seriesProto.searchPointByAngle = function (e) {
|
2145
2151
|
var series = this,
|
2146
2152
|
chart = series.chart,
|
2147
2153
|
xAxis = series.xAxis,
|
@@ -2149,28 +2155,28 @@ Axis.prototype.beforePadding = function () {
|
|
2149
2155
|
plotX = e.chartX - center[0] - chart.plotLeft,
|
2150
2156
|
plotY = e.chartY - center[1] - chart.plotTop;
|
2151
2157
|
|
2152
|
-
this.
|
2153
|
-
e = {
|
2158
|
+
return this.searchKDTree({
|
2154
2159
|
clientX: 180 + (Math.atan2(plotX, plotY) * (-180 / Math.PI))
|
2155
|
-
};
|
2156
|
-
return this.searchKDTree(e);
|
2160
|
+
});
|
2157
2161
|
|
2158
2162
|
};
|
2159
2163
|
|
2164
|
+
/**
|
2165
|
+
* Wrap the buildKDTree function so that it searches by angle (clientX) in case of shared tooltip,
|
2166
|
+
* and by two dimensional distance in case of non-shared.
|
2167
|
+
*/
|
2160
2168
|
wrap(seriesProto, 'buildKDTree', function (proceed) {
|
2161
2169
|
if (this.chart.polar) {
|
2162
|
-
this.
|
2170
|
+
if (this.kdByAngle) {
|
2171
|
+
this.searchPoint = this.searchPointByAngle;
|
2172
|
+
} else {
|
2173
|
+
this.kdDimensions = 2;
|
2174
|
+
this.kdComparer = 'distR';
|
2175
|
+
}
|
2163
2176
|
}
|
2164
2177
|
proceed.apply(this);
|
2165
2178
|
});
|
2166
|
-
|
2167
|
-
wrap(seriesProto, 'searchPoint', function (proceed, e) {
|
2168
|
-
if (this.chart.polar) {
|
2169
|
-
return this.searchPolarPoint(e);
|
2170
|
-
} else {
|
2171
|
-
return proceed.call(this, e);
|
2172
|
-
}
|
2173
|
-
});
|
2179
|
+
|
2174
2180
|
/**
|
2175
2181
|
* Translate a point's plotX and plotY from the internal angle and radius measures to
|
2176
2182
|
* true plotX, plotY coordinates
|
@@ -2186,18 +2192,22 @@ Axis.prototype.beforePadding = function () {
|
|
2186
2192
|
point.rectPlotX = plotX;
|
2187
2193
|
point.rectPlotY = plotY;
|
2188
2194
|
|
2189
|
-
// Record the angle in degrees for use in tooltip
|
2190
|
-
clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
|
2191
|
-
if (clientX < 0) { // #2665
|
2192
|
-
clientX += 360;
|
2193
|
-
}
|
2194
|
-
point.clientX = clientX;
|
2195
|
-
|
2196
|
-
|
2197
2195
|
// Find the polar plotX and plotY
|
2198
2196
|
xy = this.xAxis.postTranslate(point.plotX, this.yAxis.len - plotY);
|
2199
2197
|
point.plotX = point.polarPlotX = xy.x - chart.plotLeft;
|
2200
2198
|
point.plotY = point.polarPlotY = xy.y - chart.plotTop;
|
2199
|
+
|
2200
|
+
// If shared tooltip, record the angle in degrees in order to align X points. Otherwise,
|
2201
|
+
// use a standard k-d tree to get the nearest point in two dimensions.
|
2202
|
+
if (this.kdByAngle) {
|
2203
|
+
clientX = ((plotX / Math.PI * 180) + this.xAxis.pane.options.startAngle) % 360;
|
2204
|
+
if (clientX < 0) { // #2665
|
2205
|
+
clientX += 360;
|
2206
|
+
}
|
2207
|
+
point.clientX = clientX;
|
2208
|
+
} else {
|
2209
|
+
point.clientX = point.plotX;
|
2210
|
+
}
|
2201
2211
|
};
|
2202
2212
|
|
2203
2213
|
/**
|
@@ -2345,17 +2355,25 @@ Axis.prototype.beforePadding = function () {
|
|
2345
2355
|
* center.
|
2346
2356
|
*/
|
2347
2357
|
wrap(seriesProto, 'translate', function (proceed) {
|
2348
|
-
|
2358
|
+
var chart = this.chart,
|
2359
|
+
points,
|
2360
|
+
i;
|
2361
|
+
|
2349
2362
|
// Run uber method
|
2350
2363
|
proceed.call(this);
|
2351
2364
|
|
2352
2365
|
// Postprocess plot coordinates
|
2353
|
-
if (
|
2354
|
-
|
2366
|
+
if (chart.polar) {
|
2367
|
+
this.kdByAngle = chart.tooltip.shared;
|
2368
|
+
|
2369
|
+
if (!this.preventPostTranslate) {
|
2370
|
+
points = this.points;
|
2355
2371
|
i = points.length;
|
2356
|
-
|
2357
|
-
|
2358
|
-
|
2372
|
+
|
2373
|
+
while (i--) {
|
2374
|
+
// Translate plotX, plotY from angle and radius to true plot coordinates
|
2375
|
+
this.toXY(points[i]);
|
2376
|
+
}
|
2359
2377
|
}
|
2360
2378
|
}
|
2361
2379
|
});
|
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
|
|
2908
2908
|
});
|
2909
2909
|
}
|
2910
2910
|
}/**
|
2911
|
-
* @license Highcharts JS v4.1.
|
2911
|
+
* @license Highcharts JS v4.1.5 (2015-04-13)
|
2912
2912
|
* CanVGRenderer Extension module
|
2913
2913
|
*
|
2914
2914
|
* (c) 2011-2012 Torstein Honsi, Erik Olsson
|
@@ -23,9 +23,9 @@
|
|
23
23
|
seriesTypes = H.seriesTypes,
|
24
24
|
PieSeries = seriesTypes.pie,
|
25
25
|
ColumnSeries = seriesTypes.column,
|
26
|
+
Tick = H.Tick,
|
26
27
|
fireEvent = HighchartsAdapter.fireEvent,
|
27
28
|
inArray = HighchartsAdapter.inArray,
|
28
|
-
dupes = [],
|
29
29
|
ddSeriesId = 1;
|
30
30
|
|
31
31
|
// Utilities
|
@@ -42,8 +42,7 @@
|
|
42
42
|
|
43
43
|
// Unsupported color, return to-color (#3920)
|
44
44
|
if (!to.rgba.length || !from.rgba.length) {
|
45
|
-
|
46
|
-
ret = to.raw;
|
45
|
+
ret = to.raw || 'none';
|
47
46
|
|
48
47
|
// Interpolate
|
49
48
|
} else {
|
@@ -128,9 +127,21 @@
|
|
128
127
|
levelSeries = [],
|
129
128
|
levelSeriesOptions = [],
|
130
129
|
level,
|
131
|
-
levelNumber
|
130
|
+
levelNumber,
|
131
|
+
last;
|
132
132
|
|
133
|
+
if (!this.drilldownLevels) {
|
134
|
+
this.drilldownLevels = [];
|
135
|
+
}
|
136
|
+
|
133
137
|
levelNumber = oldSeries.options._levelNumber || 0;
|
138
|
+
|
139
|
+
// See if we can reuse the registered series from last run
|
140
|
+
last = this.drilldownLevels[this.drilldownLevels.length - 1];
|
141
|
+
if (last && last.levelNumber !== levelNumber) {
|
142
|
+
last = undefined;
|
143
|
+
}
|
144
|
+
|
134
145
|
|
135
146
|
ddOptions = extend({
|
136
147
|
color: color,
|
@@ -140,12 +151,18 @@
|
|
140
151
|
|
141
152
|
// Record options for all current series
|
142
153
|
each(oldSeries.chart.series, function (series) {
|
143
|
-
if (series.xAxis === xAxis) {
|
144
|
-
levelSeries.push(series);
|
154
|
+
if (series.xAxis === xAxis && !series.isDrilling) {
|
145
155
|
series.options._ddSeriesId = series.options._ddSeriesId || ddSeriesId++;
|
146
156
|
series.options._colorIndex = series.userOptions._colorIndex;
|
147
|
-
levelSeriesOptions.push(series.options);
|
148
157
|
series.options._levelNumber = series.options._levelNumber || levelNumber; // #3182
|
158
|
+
|
159
|
+
if (last) {
|
160
|
+
levelSeries = last.levelSeries;
|
161
|
+
levelSeriesOptions = last.levelSeriesOptions;
|
162
|
+
} else {
|
163
|
+
levelSeries.push(series);
|
164
|
+
levelSeriesOptions.push(series.options);
|
165
|
+
}
|
149
166
|
}
|
150
167
|
});
|
151
168
|
|
@@ -169,10 +186,7 @@
|
|
169
186
|
}
|
170
187
|
};
|
171
188
|
|
172
|
-
//
|
173
|
-
if (!this.drilldownLevels) {
|
174
|
-
this.drilldownLevels = [];
|
175
|
-
}
|
189
|
+
// Push it to the lookup array
|
176
190
|
this.drilldownLevels.push(level);
|
177
191
|
|
178
192
|
newSeries = level.lowerSeries = this.addSeries(ddOptions, false);
|
@@ -298,7 +312,8 @@
|
|
298
312
|
if (!oldSeries.chart) { // #2786
|
299
313
|
seriesI = chartSeries.length; // #2919
|
300
314
|
while (seriesI--) {
|
301
|
-
if (chartSeries[seriesI].options.id === level.lowerSeriesOptions.id
|
315
|
+
if (chartSeries[seriesI].options.id === level.lowerSeriesOptions.id &&
|
316
|
+
chartSeries[seriesI].options._levelNumber === levelNumber + 1) { // #3867
|
302
317
|
oldSeries = chartSeries[seriesI];
|
303
318
|
break;
|
304
319
|
}
|
@@ -342,7 +357,7 @@
|
|
342
357
|
.align();
|
343
358
|
}
|
344
359
|
|
345
|
-
|
360
|
+
this.ddDupes.length = []; // #3315
|
346
361
|
};
|
347
362
|
|
348
363
|
|
@@ -513,11 +528,15 @@
|
|
513
528
|
drilldown = chart.options.drilldown,
|
514
529
|
i = (drilldown.series || []).length,
|
515
530
|
seriesOptions;
|
531
|
+
|
532
|
+
if (!chart.ddDupes) {
|
533
|
+
chart.ddDupes = [];
|
534
|
+
}
|
516
535
|
|
517
536
|
while (i-- && !seriesOptions) {
|
518
|
-
if (drilldown.series[i].id === this.drilldown && inArray(this.drilldown,
|
537
|
+
if (drilldown.series[i].id === this.drilldown && inArray(this.drilldown, chart.ddDupes) === -1) {
|
519
538
|
seriesOptions = drilldown.series[i];
|
520
|
-
|
539
|
+
chart.ddDupes.push(this.drilldown);
|
521
540
|
}
|
522
541
|
}
|
523
542
|
|
@@ -527,7 +546,7 @@
|
|
527
546
|
point: this,
|
528
547
|
seriesOptions: seriesOptions,
|
529
548
|
category: category,
|
530
|
-
points: category !== undefined && this.series.xAxis.
|
549
|
+
points: category !== undefined && this.series.xAxis.ddPoints[category].slice(0)
|
531
550
|
});
|
532
551
|
|
533
552
|
if (seriesOptions) {
|
@@ -543,13 +562,70 @@
|
|
543
562
|
* Drill down to a given category. This is the same as clicking on an axis label.
|
544
563
|
*/
|
545
564
|
H.Axis.prototype.drilldownCategory = function (x) {
|
546
|
-
|
547
|
-
|
565
|
+
var key,
|
566
|
+
point,
|
567
|
+
ddPointsX = this.ddPoints[x];
|
568
|
+
for (key in ddPointsX) {
|
569
|
+
point = ddPointsX[key];
|
570
|
+
if (point && point.series && point.series.visible && point.doDrilldown) { // #3197
|
548
571
|
point.doDrilldown(true, x);
|
549
572
|
}
|
550
|
-
}
|
573
|
+
}
|
551
574
|
this.chart.applyDrilldown();
|
552
575
|
};
|
576
|
+
|
577
|
+
/**
|
578
|
+
* Create and return a collection of points associated with the X position. Reset it for each level.
|
579
|
+
*/
|
580
|
+
H.Axis.prototype.getDDPoints = function (x, levelNumber) {
|
581
|
+
var ddPoints = this.ddPoints;
|
582
|
+
if (!ddPoints) {
|
583
|
+
this.ddPoints = ddPoints = {};
|
584
|
+
}
|
585
|
+
if (!ddPoints[x]) {
|
586
|
+
ddPoints[x] = [];
|
587
|
+
}
|
588
|
+
if (ddPoints[x].levelNumber !== levelNumber) {
|
589
|
+
ddPoints[x].length = 0; // reset
|
590
|
+
}
|
591
|
+
return ddPoints[x];
|
592
|
+
};
|
593
|
+
|
594
|
+
|
595
|
+
/**
|
596
|
+
* Make a tick label drillable, or remove drilling on update
|
597
|
+
*/
|
598
|
+
Tick.prototype.drillable = function () {
|
599
|
+
var pos = this.pos,
|
600
|
+
label = this.label,
|
601
|
+
axis = this.axis,
|
602
|
+
ddPointsX = axis.ddPoints && axis.ddPoints[pos];
|
603
|
+
|
604
|
+
if (label && ddPointsX && ddPointsX.length) {
|
605
|
+
if (!label.basicStyles) {
|
606
|
+
label.basicStyles = H.merge(label.styles);
|
607
|
+
}
|
608
|
+
label
|
609
|
+
.addClass('highcharts-drilldown-axis-label')
|
610
|
+
.css(axis.chart.options.drilldown.activeAxisLabelStyle)
|
611
|
+
.on('click', function () {
|
612
|
+
axis.drilldownCategory(pos);
|
613
|
+
});
|
614
|
+
|
615
|
+
} else if (label && label.basicStyles) {
|
616
|
+
label.styles = {}; // reset for full overwrite of styles
|
617
|
+
label.css(label.basicStyles);
|
618
|
+
label.on('click', null); // #3806
|
619
|
+
}
|
620
|
+
};
|
621
|
+
|
622
|
+
/**
|
623
|
+
* Always keep the drillability updated (#3951)
|
624
|
+
*/
|
625
|
+
wrap(Tick.prototype, 'addLabel', function (proceed) {
|
626
|
+
proceed.call(this);
|
627
|
+
this.drillable();
|
628
|
+
});
|
553
629
|
|
554
630
|
|
555
631
|
/**
|
@@ -558,20 +634,10 @@
|
|
558
634
|
*/
|
559
635
|
wrap(H.Point.prototype, 'init', function (proceed, series, options, x) {
|
560
636
|
var point = proceed.call(this, series, options, x),
|
561
|
-
|
562
|
-
tick =
|
563
|
-
|
637
|
+
xAxis = series.xAxis,
|
638
|
+
tick = xAxis && xAxis.ticks[x],
|
639
|
+
ddPointsX = xAxis && xAxis.getDDPoints(x, series.options._levelNumber);
|
564
640
|
|
565
|
-
// Create a collection of points associated with the label. Reset it for each level.
|
566
|
-
if (tickLabel) {
|
567
|
-
if (!tickLabel.ddPoints) {
|
568
|
-
tickLabel.ddPoints = [];
|
569
|
-
}
|
570
|
-
if (tickLabel.levelNumber !== series.options._levelNumber) {
|
571
|
-
tickLabel.ddPoints.length = 0; // reset
|
572
|
-
}
|
573
|
-
}
|
574
|
-
|
575
641
|
if (point.drilldown) {
|
576
642
|
|
577
643
|
// Add the click event to the point
|
@@ -587,26 +653,18 @@
|
|
587
653
|
}
|
588
654
|
});*/
|
589
655
|
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
tickLabel
|
596
|
-
.addClass('highcharts-drilldown-axis-label')
|
597
|
-
.css(chart.options.drilldown.activeAxisLabelStyle)
|
598
|
-
.on('click', function () {
|
599
|
-
series.xAxis.drilldownCategory(x);
|
600
|
-
});
|
601
|
-
|
602
|
-
tickLabel.ddPoints.push(point);
|
603
|
-
tickLabel.levelNumber = series.options._levelNumber;
|
604
|
-
|
656
|
+
|
657
|
+
// Register drilldown points on this X value
|
658
|
+
if (ddPointsX) {
|
659
|
+
ddPointsX.push(point);
|
660
|
+
ddPointsX.levelNumber = series.options._levelNumber;
|
605
661
|
}
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
662
|
+
|
663
|
+
}
|
664
|
+
|
665
|
+
// Add or remove click handler and style on the tick label
|
666
|
+
if (tick) {
|
667
|
+
tick.drillable();
|
610
668
|
}
|
611
669
|
|
612
670
|
return point;
|
@@ -623,10 +681,7 @@
|
|
623
681
|
.attr({
|
624
682
|
'class': 'highcharts-drilldown-data-label'
|
625
683
|
})
|
626
|
-
.css(css)
|
627
|
-
.on('click', function () {
|
628
|
-
point.doDrilldown();
|
629
|
-
});
|
684
|
+
.css(css);
|
630
685
|
}
|
631
686
|
});
|
632
687
|
});
|