highcharts-rails 4.2.0 → 4.2.2
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 +4 -4
- data/CHANGELOG.markdown +37 -0
- data/app/assets/javascripts/highcharts.js +690 -489
- data/app/assets/javascripts/highcharts/highcharts-3d.js +9 -8
- data/app/assets/javascripts/highcharts/highcharts-more.js +88 -99
- data/app/assets/javascripts/highcharts/modules/boost.js +88 -89
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +3 -3
- data/app/assets/javascripts/highcharts/modules/canvas-tools.js +2 -2
- data/app/assets/javascripts/highcharts/modules/data.js +2 -2
- data/app/assets/javascripts/highcharts/modules/exporting.js +5 -4
- data/app/assets/javascripts/highcharts/modules/funnel.js +17 -11
- data/app/assets/javascripts/highcharts/modules/heatmap.js +2 -2
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +2 -2
- data/app/assets/javascripts/highcharts/modules/offline-exporting.js +58 -38
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +15 -10
- data/app/assets/javascripts/highcharts/modules/treemap.js +1 -1
- data/lib/highcharts/version.rb +1 -1
- metadata +1 -1
@@ -2,7 +2,7 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.2.
|
5
|
+
* @license Highcharts JS v4.2.2 (2016-02-04)
|
6
6
|
*
|
7
7
|
* 3D features for Highcharts JS
|
8
8
|
*
|
@@ -251,7 +251,7 @@
|
|
251
251
|
this.top.attr({ d: paths[1], zIndex: paths[4] });
|
252
252
|
this.side.attr({ d: paths[2], zIndex: paths[5] });
|
253
253
|
} else {
|
254
|
-
Highcharts.SVGElement.prototype.attr.call(this, args);
|
254
|
+
return Highcharts.SVGElement.prototype.attr.call(this, args); // getter returns value
|
255
255
|
}
|
256
256
|
|
257
257
|
return this;
|
@@ -263,6 +263,9 @@
|
|
263
263
|
this.front.attr({ zIndex: paths[3] }).animate({ d: paths[0] }, duration, complete);
|
264
264
|
this.top.attr({ zIndex: paths[4] }).animate({ d: paths[1] }, duration, complete);
|
265
265
|
this.side.attr({ zIndex: paths[5] }).animate({ d: paths[2] }, duration, complete);
|
266
|
+
this.attr({
|
267
|
+
zIndex: -paths[6] // #4774
|
268
|
+
});
|
266
269
|
} else if (args.opacity) {
|
267
270
|
this.front.animate(args, duration, complete);
|
268
271
|
this.top.animate(args, duration, complete);
|
@@ -283,7 +286,7 @@
|
|
283
286
|
};
|
284
287
|
|
285
288
|
// Apply the Z index to the cuboid group
|
286
|
-
result.attr({ zIndex: -paths[
|
289
|
+
result.attr({ zIndex: -paths[6] });
|
287
290
|
|
288
291
|
return result;
|
289
292
|
};
|
@@ -321,15 +324,13 @@
|
|
321
324
|
return pArr[i];
|
322
325
|
}
|
323
326
|
var pickShape = function (path1, path2) {
|
324
|
-
var ret;
|
327
|
+
var ret = [];
|
325
328
|
path1 = map(path1, mapPath);
|
326
329
|
path2 = map(path2, mapPath);
|
327
330
|
if (shapeArea(path1) < 0) {
|
328
331
|
ret = path1;
|
329
332
|
} else if (shapeArea(path2) < 0) {
|
330
333
|
ret = path2;
|
331
|
-
} else {
|
332
|
-
ret = [];
|
333
334
|
}
|
334
335
|
return ret;
|
335
336
|
};
|
@@ -349,7 +350,7 @@
|
|
349
350
|
var left = [0, 7, 4, 3];
|
350
351
|
var path3 = pickShape(right, left);
|
351
352
|
|
352
|
-
return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3)];
|
353
|
+
return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3), averageZ(map(bottom, mapPath)) * 9e9]; // #4774
|
353
354
|
};
|
354
355
|
|
355
356
|
////// SECTORS //////
|
@@ -747,7 +748,7 @@
|
|
747
748
|
plotOptions,
|
748
749
|
pieOptions;
|
749
750
|
|
750
|
-
if (args[0].chart.options3d && args[0].chart.options3d.enabled) {
|
751
|
+
if (args[0].chart && args[0].chart.options3d && args[0].chart.options3d.enabled) {
|
751
752
|
// Normalize alpha and beta to (-360, 360) range
|
752
753
|
args[0].chart.options3d.alpha = (args[0].chart.options3d.alpha || 0) % 360;
|
753
754
|
args[0].chart.options3d.beta = (args[0].chart.options3d.beta || 0) % 360;
|
@@ -2,9 +2,9 @@
|
|
2
2
|
// @compilation_level SIMPLE_OPTIMIZATIONS
|
3
3
|
|
4
4
|
/**
|
5
|
-
* @license Highcharts JS v4.2.
|
5
|
+
* @license Highcharts JS v4.2.2 (2016-02-04)
|
6
6
|
*
|
7
|
-
* (c) 2009-
|
7
|
+
* (c) 2009-2016 Torstein Honsi
|
8
8
|
*
|
9
9
|
* License: www.highcharts.com/license
|
10
10
|
*/
|
@@ -563,6 +563,17 @@ var arrayMin = Highcharts.arrayMin,
|
|
563
563
|
|
564
564
|
});
|
565
565
|
|
566
|
+
/**
|
567
|
+
* Wrap auto label align to avoid setting axis-wide rotation on radial axes (#4920)
|
568
|
+
* @param {Function} proceed
|
569
|
+
* @returns {String} Alignment
|
570
|
+
*/
|
571
|
+
wrap(axisProto, 'autoLabelAlign', function (proceed) {
|
572
|
+
if (!this.isRadial) {
|
573
|
+
return proceed.apply(this, [].slice.call(arguments, 1));
|
574
|
+
} // else return undefined
|
575
|
+
});
|
576
|
+
|
566
577
|
/**
|
567
578
|
* Add special cases within the Tick class' methods for radial axes.
|
568
579
|
*/
|
@@ -709,22 +720,6 @@ var arrayMin = Highcharts.arrayMin,
|
|
709
720
|
point.plotHigh = xy.y - chart.plotTop;
|
710
721
|
},
|
711
722
|
|
712
|
-
/**
|
713
|
-
* Extend getSegments to force null points if the higher value is null. #1703.
|
714
|
-
*/
|
715
|
-
getSegments: function () {
|
716
|
-
var series = this;
|
717
|
-
|
718
|
-
each(series.points, function (point) {
|
719
|
-
if (!series.options.connectNulls && (point.low === null || point.high === null)) {
|
720
|
-
point.y = null;
|
721
|
-
} else if (point.low === null && point.high !== null) {
|
722
|
-
point.y = point.high;
|
723
|
-
}
|
724
|
-
});
|
725
|
-
Series.prototype.getSegments.call(this);
|
726
|
-
},
|
727
|
-
|
728
723
|
/**
|
729
724
|
* Translate data points from raw values x and y to plotX and plotY
|
730
725
|
*/
|
@@ -741,14 +736,8 @@ var arrayMin = Highcharts.arrayMin,
|
|
741
736
|
high = point.high,
|
742
737
|
plotY = point.plotY;
|
743
738
|
|
744
|
-
if (high === null
|
745
|
-
point.
|
746
|
-
} else if (low === null) {
|
747
|
-
point.plotLow = point.plotY = null;
|
748
|
-
point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
|
749
|
-
} else if (high === null) {
|
750
|
-
point.plotLow = plotY;
|
751
|
-
point.plotHigh = null;
|
739
|
+
if (high === null || low === null) {
|
740
|
+
point.isNull = true;
|
752
741
|
} else {
|
753
742
|
point.plotLow = plotY;
|
754
743
|
point.plotHigh = yAxis.translate(high, 0, 1, 0, 1);
|
@@ -767,44 +756,60 @@ var arrayMin = Highcharts.arrayMin,
|
|
767
756
|
* Extend the line series' getSegmentPath method by applying the segment
|
768
757
|
* path to both lower and higher values of the range
|
769
758
|
*/
|
770
|
-
|
771
|
-
|
772
|
-
var
|
773
|
-
|
774
|
-
|
775
|
-
|
759
|
+
getGraphPath: function () {
|
760
|
+
|
761
|
+
var points = this.points,
|
762
|
+
highPoints = [],
|
763
|
+
highAreaPoints = [],
|
764
|
+
i = points.length,
|
765
|
+
getGraphPath = Series.prototype.getGraphPath,
|
776
766
|
point,
|
767
|
+
pointShim,
|
777
768
|
linePath,
|
778
769
|
lowerPath,
|
779
770
|
options = this.options,
|
780
771
|
step = options.step,
|
781
|
-
higherPath
|
782
|
-
|
783
|
-
// Remove nulls from low segment
|
784
|
-
lowSegment = Highcharts.grep(segment, function (point) {
|
785
|
-
return point.plotLow !== null;
|
786
|
-
});
|
772
|
+
higherPath,
|
773
|
+
higherAreaPath;
|
787
774
|
|
788
|
-
//
|
775
|
+
// Create the top line and the top part of the area fill. The area fill compensates for
|
776
|
+
// null points by drawing down to the lower graph, moving across the null gap and
|
777
|
+
// starting again at the lower graph.
|
778
|
+
i = points.length;
|
789
779
|
while (i--) {
|
790
|
-
point =
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
780
|
+
point = points[i];
|
781
|
+
|
782
|
+
if (!point.isNull && (!points[i + 1] || points[i + 1].isNull)) {
|
783
|
+
highAreaPoints.push({
|
784
|
+
plotX: point.plotX,
|
785
|
+
plotY: point.plotLow
|
786
|
+
});
|
787
|
+
}
|
788
|
+
pointShim = {
|
789
|
+
plotX: point.plotX,
|
790
|
+
plotY: point.plotHigh,
|
791
|
+
isNull: point.isNull
|
792
|
+
};
|
793
|
+
highAreaPoints.push(pointShim);
|
794
|
+
highPoints.push(pointShim);
|
795
|
+
if (!point.isNull && (!points[i - 1] || points[i - 1].isNull)) {
|
796
|
+
highAreaPoints.push({
|
797
|
+
plotX: point.plotX,
|
798
|
+
plotY: point.plotLow
|
795
799
|
});
|
796
800
|
}
|
797
801
|
}
|
798
802
|
|
799
803
|
// Get the paths
|
800
|
-
lowerPath =
|
804
|
+
lowerPath = getGraphPath.call(this, points);
|
801
805
|
if (step) {
|
802
806
|
if (step === true) {
|
803
807
|
step = 'left';
|
804
808
|
}
|
805
|
-
options.step = { left: 'right', center: 'center', right: 'left' }[step]; // swap for reading in
|
809
|
+
options.step = { left: 'right', center: 'center', right: 'left' }[step]; // swap for reading in getGraphPath
|
806
810
|
}
|
807
|
-
higherPath =
|
811
|
+
higherPath = getGraphPath.call(this, highPoints);
|
812
|
+
higherAreaPath = getGraphPath.call(this, highAreaPoints);
|
808
813
|
options.step = step;
|
809
814
|
|
810
815
|
// Create a line on both top and bottom of the range
|
@@ -812,10 +817,10 @@ var arrayMin = Highcharts.arrayMin,
|
|
812
817
|
|
813
818
|
// For the area path, we need to change the 'move' statement into 'lineTo' or 'curveTo'
|
814
819
|
if (!this.chart.polar) {
|
815
|
-
|
820
|
+
higherAreaPath[0] = 'L'; // this probably doesn't work for spline
|
816
821
|
}
|
817
|
-
this.areaPath = this.areaPath.concat(lowerPath,
|
818
|
-
|
822
|
+
this.areaPath = this.areaPath.concat(lowerPath, higherAreaPath);
|
823
|
+
|
819
824
|
return linePath;
|
820
825
|
},
|
821
826
|
|
@@ -1289,7 +1294,7 @@ var arrayMin = Highcharts.arrayMin,
|
|
1289
1294
|
//stemWidth: null,
|
1290
1295
|
threshold: null,
|
1291
1296
|
tooltip: {
|
1292
|
-
pointFormat: '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
|
1297
|
+
pointFormat: '<span style="color:{point.color}">\u25CF</span> <b> {series.name}</b><br/>' +
|
1293
1298
|
'Maximum: {point.high}<br/>' +
|
1294
1299
|
'Upper quartile: {point.q3}<br/>' +
|
1295
1300
|
'Median: {point.median}<br/>' +
|
@@ -1551,7 +1556,7 @@ var arrayMin = Highcharts.arrayMin,
|
|
1551
1556
|
grouping: false,
|
1552
1557
|
linkedTo: ':previous',
|
1553
1558
|
tooltip: {
|
1554
|
-
pointFormat: '<span style="color:{point.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'
|
1559
|
+
pointFormat: '<span style="color:{point.color}">\u25CF</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'
|
1555
1560
|
},
|
1556
1561
|
whiskerWidth: null
|
1557
1562
|
});
|
@@ -1627,12 +1632,14 @@ var arrayMin = Highcharts.arrayMin,
|
|
1627
1632
|
previousY,
|
1628
1633
|
previousIntermediate,
|
1629
1634
|
range,
|
1635
|
+
minPointLength = pick(options.minPointLength, 5),
|
1630
1636
|
threshold = options.threshold,
|
1631
1637
|
stacking = options.stacking,
|
1632
1638
|
tooltipY;
|
1633
1639
|
|
1634
1640
|
// run column series translate
|
1635
1641
|
seriesTypes.column.prototype.translate.apply(this);
|
1642
|
+
series.minPointLengthOffset = 0;
|
1636
1643
|
|
1637
1644
|
previousY = previousIntermediate = threshold;
|
1638
1645
|
points = series.points;
|
@@ -1664,11 +1671,11 @@ var arrayMin = Highcharts.arrayMin,
|
|
1664
1671
|
// sum points
|
1665
1672
|
if (point.isSum) {
|
1666
1673
|
shapeArgs.y = yAxis.translate(range[1], 0, 1);
|
1667
|
-
shapeArgs.height = Math.min(yAxis.translate(range[0], 0, 1), yAxis.len) - shapeArgs.y; // #4256
|
1674
|
+
shapeArgs.height = Math.min(yAxis.translate(range[0], 0, 1), yAxis.len) - shapeArgs.y + series.minPointLengthOffset; // #4256
|
1668
1675
|
|
1669
1676
|
} else if (point.isIntermediateSum) {
|
1670
1677
|
shapeArgs.y = yAxis.translate(range[1], 0, 1);
|
1671
|
-
shapeArgs.height = Math.min(yAxis.translate(previousIntermediate, 0, 1), yAxis.len) - shapeArgs.y;
|
1678
|
+
shapeArgs.height = Math.min(yAxis.translate(previousIntermediate, 0, 1), yAxis.len) - shapeArgs.y + series.minPointLengthOffset;
|
1672
1679
|
previousIntermediate = range[1];
|
1673
1680
|
|
1674
1681
|
// If it's not the sum point, update previous stack end position and get
|
@@ -1691,8 +1698,15 @@ var arrayMin = Highcharts.arrayMin,
|
|
1691
1698
|
shapeArgs.height = mathMax(mathRound(shapeArgs.height), 0.001); // #3151
|
1692
1699
|
point.yBottom = shapeArgs.y + shapeArgs.height;
|
1693
1700
|
|
1701
|
+
if (shapeArgs.height <= minPointLength) {
|
1702
|
+
shapeArgs.height = minPointLength;
|
1703
|
+
series.minPointLengthOffset += minPointLength;
|
1704
|
+
}
|
1705
|
+
|
1706
|
+
shapeArgs.y -= series.minPointLengthOffset;
|
1707
|
+
|
1694
1708
|
// Correct tooltip placement (#3014)
|
1695
|
-
tooltipY = point.plotY + (point.negative ? shapeArgs.height : 0);
|
1709
|
+
tooltipY = point.plotY + (point.negative ? shapeArgs.height : 0) - series.minPointLengthOffset;
|
1696
1710
|
if (series.chart.inverted) {
|
1697
1711
|
point.tooltipPos[0] = yAxis.len - tooltipY;
|
1698
1712
|
} else {
|
@@ -2283,40 +2297,6 @@ var arrayMin = Highcharts.arrayMin,
|
|
2283
2297
|
}
|
2284
2298
|
};
|
2285
2299
|
|
2286
|
-
/**
|
2287
|
-
* Add some special init logic to areas and areasplines
|
2288
|
-
*/
|
2289
|
-
function initArea(proceed, chart, options) {
|
2290
|
-
proceed.call(this, chart, options);
|
2291
|
-
if (this.chart.polar) {
|
2292
|
-
|
2293
|
-
/**
|
2294
|
-
* Overridden method to close a segment path. While in a cartesian plane the area
|
2295
|
-
* goes down to the threshold, in the polar chart it goes to the center.
|
2296
|
-
*/
|
2297
|
-
this.closeSegment = function (path) {
|
2298
|
-
var center = this.xAxis.center;
|
2299
|
-
path.push(
|
2300
|
-
'L',
|
2301
|
-
center[0],
|
2302
|
-
center[1]
|
2303
|
-
);
|
2304
|
-
};
|
2305
|
-
|
2306
|
-
// Instead of complicated logic to draw an area around the inner area in a stack,
|
2307
|
-
// just draw it behind
|
2308
|
-
this.closedStacks = true;
|
2309
|
-
}
|
2310
|
-
}
|
2311
|
-
|
2312
|
-
|
2313
|
-
if (seriesTypes.area) {
|
2314
|
-
wrap(seriesTypes.area.prototype, 'init', initArea);
|
2315
|
-
}
|
2316
|
-
if (seriesTypes.areaspline) {
|
2317
|
-
wrap(seriesTypes.areaspline.prototype, 'init', initArea);
|
2318
|
-
}
|
2319
|
-
|
2320
2300
|
if (seriesTypes.spline) {
|
2321
2301
|
/**
|
2322
2302
|
* Overridden method for calculating a spline from one point to the next
|
@@ -2455,20 +2435,29 @@ var arrayMin = Highcharts.arrayMin,
|
|
2455
2435
|
* Extend getSegmentPath to allow connecting ends across 0 to provide a closed circle in
|
2456
2436
|
* line-like series.
|
2457
2437
|
*/
|
2458
|
-
wrap(seriesProto, '
|
2459
|
-
|
2460
|
-
|
2461
|
-
|
2438
|
+
wrap(seriesProto, 'getGraphPath', function (proceed, points) {
|
2439
|
+
var series = this;
|
2440
|
+
|
2462
2441
|
// Connect the path
|
2463
|
-
if (this.chart.polar
|
2464
|
-
|
2465
|
-
|
2466
|
-
|
2442
|
+
if (this.chart.polar) {
|
2443
|
+
points = points || this.points;
|
2444
|
+
|
2445
|
+
if (this.options.connectEnds !== false && points[0].y !== null) {
|
2446
|
+
this.connectEnds = true; // re-used in splines
|
2447
|
+
points.splice(points.length, 0, points[0]);
|
2448
|
+
}
|
2449
|
+
|
2450
|
+
// For area charts, pseudo points are added to the graph, now we need to translate these
|
2451
|
+
each(points, function (point) {
|
2452
|
+
if (point.polarPlotY === undefined) {
|
2453
|
+
series.toXY(point);
|
2454
|
+
}
|
2455
|
+
});
|
2467
2456
|
}
|
2468
2457
|
|
2469
2458
|
// Run uber method
|
2470
|
-
return proceed.
|
2471
|
-
|
2459
|
+
return proceed.apply(this, [].slice.call(arguments, 1));
|
2460
|
+
|
2472
2461
|
});
|
2473
2462
|
|
2474
2463
|
|
@@ -68,18 +68,28 @@
|
|
68
68
|
pick = H.pick,
|
69
69
|
wrap = H.wrap,
|
70
70
|
plotOptions = H.getOptions().plotOptions,
|
71
|
-
CHUNK_SIZE = 50000
|
71
|
+
CHUNK_SIZE = 50000,
|
72
|
+
destroyLoadingDiv;
|
72
73
|
|
73
74
|
function eachAsync(arr, fn, finalFunc, chunkSize, i) {
|
74
75
|
i = i || 0;
|
75
76
|
chunkSize = chunkSize || CHUNK_SIZE;
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
|
78
|
+
var threshold = i + chunkSize,
|
79
|
+
proceed = true;
|
80
|
+
|
81
|
+
while (proceed && i < threshold && i < arr.length) {
|
82
|
+
proceed = fn(arr[i], i);
|
83
|
+
i = i + 1;
|
84
|
+
}
|
85
|
+
if (proceed) {
|
86
|
+
if (i < arr.length) {
|
87
|
+
setTimeout(function () {
|
88
|
+
eachAsync(arr, fn, finalFunc, chunkSize, i);
|
89
|
+
});
|
90
|
+
} else if (finalFunc) {
|
91
|
+
finalFunc();
|
92
|
+
}
|
83
93
|
}
|
84
94
|
}
|
85
95
|
|
@@ -240,7 +250,6 @@
|
|
240
250
|
xAxis = this.xAxis,
|
241
251
|
yAxis = this.yAxis,
|
242
252
|
ctx,
|
243
|
-
i,
|
244
253
|
c = 0,
|
245
254
|
xData = series.processedXData,
|
246
255
|
yData = series.processedYData,
|
@@ -382,112 +391,106 @@
|
|
382
391
|
opacity: 1
|
383
392
|
}
|
384
393
|
});
|
394
|
+
clearTimeout(destroyLoadingDiv);
|
385
395
|
chart.showLoading('Drawing...');
|
386
396
|
chart.options.loading = loadingOptions; // reset
|
387
|
-
if (chart.loadingShown === true) {
|
388
|
-
chart.loadingShown = 1;
|
389
|
-
} else {
|
390
|
-
chart.loadingShown = chart.loadingShown + 1;
|
391
|
-
}
|
392
397
|
}
|
393
398
|
|
394
399
|
// Loop over the points
|
395
|
-
i
|
396
|
-
eachAsync(isStacked ? series.data : (xData || rawData), function (d) {
|
397
|
-
|
400
|
+
eachAsync(isStacked ? series.data : (xData || rawData), function (d, i) {
|
398
401
|
var x,
|
399
402
|
y,
|
400
403
|
clientX,
|
401
404
|
plotY,
|
402
405
|
isNull,
|
403
406
|
low,
|
407
|
+
chartDestroyed = typeof chart.index === 'undefined',
|
404
408
|
isYInside = true;
|
405
409
|
|
406
|
-
if (
|
407
|
-
x = d[0];
|
408
|
-
y = d[1];
|
409
|
-
} else {
|
410
|
-
x = d;
|
411
|
-
y = yData[i];
|
412
|
-
}
|
413
|
-
|
414
|
-
// Resolve low and high for range series
|
415
|
-
if (isRange) {
|
410
|
+
if (!chartDestroyed) {
|
416
411
|
if (useRaw) {
|
417
|
-
|
412
|
+
x = d[0];
|
413
|
+
y = d[1];
|
414
|
+
} else {
|
415
|
+
x = d;
|
416
|
+
y = yData[i];
|
418
417
|
}
|
419
|
-
low = y[0];
|
420
|
-
y = y[1];
|
421
|
-
} else if (isStacked) {
|
422
|
-
x = d.x;
|
423
|
-
y = d.stackY;
|
424
|
-
low = y - d.y;
|
425
|
-
}
|
426
418
|
|
427
|
-
|
419
|
+
// Resolve low and high for range series
|
420
|
+
if (isRange) {
|
421
|
+
if (useRaw) {
|
422
|
+
y = d.slice(1, 3);
|
423
|
+
}
|
424
|
+
low = y[0];
|
425
|
+
y = y[1];
|
426
|
+
} else if (isStacked) {
|
427
|
+
x = d.x;
|
428
|
+
y = d.stackY;
|
429
|
+
low = y - d.y;
|
430
|
+
}
|
428
431
|
|
429
|
-
|
430
|
-
if (!requireSorting) {
|
431
|
-
isYInside = y >= yMin && y <= yMax;
|
432
|
-
}
|
432
|
+
isNull = y === null;
|
433
433
|
|
434
|
-
|
434
|
+
// Optimize for scatter zooming
|
435
|
+
if (!requireSorting) {
|
436
|
+
isYInside = y >= yMin && y <= yMax;
|
437
|
+
}
|
435
438
|
|
436
|
-
|
439
|
+
if (!isNull && x >= xMin && x <= xMax && isYInside) {
|
437
440
|
|
438
|
-
|
439
|
-
if (minI === undefined || clientX === lastClientX) {
|
440
|
-
if (!isRange) {
|
441
|
-
low = y;
|
442
|
-
}
|
443
|
-
if (maxI === undefined || y > maxVal) {
|
444
|
-
maxVal = y;
|
445
|
-
maxI = i;
|
446
|
-
}
|
447
|
-
if (minI === undefined || low < minVal) {
|
448
|
-
minVal = low;
|
449
|
-
minI = i;
|
450
|
-
}
|
441
|
+
clientX = Math.round(xAxis.toPixels(x, true));
|
451
442
|
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
hasThreshold ? Math.max(yBottom, translatedThreshold) : yBottom
|
461
|
-
);
|
462
|
-
addKDPoint(clientX, plotY, maxI);
|
463
|
-
if (yBottom !== plotY) {
|
464
|
-
addKDPoint(clientX, yBottom, minI);
|
443
|
+
if (sampling) {
|
444
|
+
if (minI === undefined || clientX === lastClientX) {
|
445
|
+
if (!isRange) {
|
446
|
+
low = y;
|
447
|
+
}
|
448
|
+
if (maxI === undefined || y > maxVal) {
|
449
|
+
maxVal = y;
|
450
|
+
maxI = i;
|
465
451
|
}
|
452
|
+
if (minI === undefined || low < minVal) {
|
453
|
+
minVal = low;
|
454
|
+
minI = i;
|
455
|
+
}
|
456
|
+
|
466
457
|
}
|
458
|
+
if (clientX !== lastClientX) { // Add points and reset
|
459
|
+
if (minI !== undefined) { // then maxI is also a number
|
460
|
+
plotY = yAxis.toPixels(maxVal, true);
|
461
|
+
yBottom = yAxis.toPixels(minVal, true);
|
462
|
+
drawPoint(
|
463
|
+
clientX,
|
464
|
+
hasThreshold ? Math.min(plotY, translatedThreshold) : plotY,
|
465
|
+
hasThreshold ? Math.max(yBottom, translatedThreshold) : yBottom
|
466
|
+
);
|
467
|
+
addKDPoint(clientX, plotY, maxI);
|
468
|
+
if (yBottom !== plotY) {
|
469
|
+
addKDPoint(clientX, yBottom, minI);
|
470
|
+
}
|
471
|
+
}
|
467
472
|
|
468
473
|
|
469
|
-
|
470
|
-
|
474
|
+
minI = maxI = undefined;
|
475
|
+
lastClientX = clientX;
|
476
|
+
}
|
477
|
+
} else {
|
478
|
+
plotY = Math.round(yAxis.toPixels(y, true));
|
479
|
+
drawPoint(clientX, plotY, yBottom);
|
480
|
+
addKDPoint(clientX, plotY, i);
|
471
481
|
}
|
472
|
-
} else {
|
473
|
-
plotY = Math.round(yAxis.toPixels(y, true));
|
474
|
-
drawPoint(clientX, plotY, yBottom);
|
475
|
-
addKDPoint(clientX, plotY, i);
|
476
482
|
}
|
477
|
-
|
478
|
-
wasNull = isNull && !connectNulls;
|
483
|
+
wasNull = isNull && !connectNulls;
|
479
484
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
series.canvasToSVG();
|
485
|
+
if (i % CHUNK_SIZE === 0) {
|
486
|
+
series.canvasToSVG();
|
487
|
+
}
|
484
488
|
}
|
485
489
|
|
490
|
+
return !chartDestroyed;
|
486
491
|
}, function () {
|
487
|
-
|
488
492
|
var loadingDiv = chart.loadingDiv,
|
489
|
-
loadingShown =
|
490
|
-
|
493
|
+
loadingShown = chart.loadingShown;
|
491
494
|
stroke();
|
492
495
|
series.canvasToSVG();
|
493
496
|
|
@@ -496,23 +499,19 @@
|
|
496
499
|
// Do not use chart.hideLoading, as it runs JS animation and will be blocked by buildKDTree.
|
497
500
|
// CSS animation looks good, but then it must be deleted in timeout. If we add the module to core,
|
498
501
|
// change hideLoading so we can skip this block.
|
499
|
-
if (loadingShown
|
502
|
+
if (loadingShown) {
|
500
503
|
extend(loadingDiv.style, {
|
501
504
|
transition: 'opacity 250ms',
|
502
505
|
opacity: 0
|
503
506
|
});
|
504
|
-
|
505
507
|
chart.loadingShown = false;
|
506
|
-
setTimeout(function () {
|
508
|
+
destroyLoadingDiv = setTimeout(function () {
|
507
509
|
if (loadingDiv.parentNode) { // In exporting it is falsy
|
508
510
|
loadingDiv.parentNode.removeChild(loadingDiv);
|
509
511
|
}
|
510
512
|
chart.loadingDiv = chart.loadingSpan = null;
|
511
513
|
}, 250);
|
512
514
|
}
|
513
|
-
if (loadingShown) {
|
514
|
-
chart.loadingShown = loadingShown - 1;
|
515
|
-
}
|
516
515
|
|
517
516
|
// Pass tests in Pointer.
|
518
517
|
// Replace this with a single property, and replace when zooming in
|