highcharts-rails 4.2.4 → 4.2.5
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 +28 -1
- data/app/assets/javascripts/highcharts.js +108 -67
- data/app/assets/javascripts/highcharts/highcharts-3d.js +1 -1
- data/app/assets/javascripts/highcharts/highcharts-more.js +16 -12
- data/app/assets/javascripts/highcharts/modules/boost.js +4 -3
- 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 +4 -3
- data/app/assets/javascripts/highcharts/modules/exporting.js +21 -2
- data/app/assets/javascripts/highcharts/modules/heatmap.js +8 -7
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +1 -1
- data/app/assets/javascripts/highcharts/modules/offline-exporting.js +26 -17
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +3 -2
- data/app/assets/javascripts/highcharts/modules/treemap.js +1 -1
- data/app/assets/javascripts/highcharts/themes/dark-unica.js +1 -1
- data/app/assets/javascripts/highcharts/themes/grid-light.js +1 -1
- data/app/assets/javascripts/highcharts/themes/sand-signika.js +1 -1
- data/lib/highcharts/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2939d4feed91c6aa1664e68c33af311c52c7bccc
|
4
|
+
data.tar.gz: cee7f47daf110070a74c538933732d46f056e8ad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df01b55b3c3e82c15e846e5f7f35fd0cfad67cbdbc67570ae7ebd737ff58d2c4cd19829ce599a08fb142ba771337f914b9079b688eef55dc8ae8e1079675fb1e
|
7
|
+
data.tar.gz: 54e18726fabf8b724ce627bd2538d4a8c6948d0da8fac305405e32eec19bd32229461455a11cb11a3895c21d1aab8d1602f58199775e45c7ef33cdbc92f45258
|
data/CHANGELOG.markdown
CHANGED
@@ -1,6 +1,33 @@
|
|
1
|
+
# 4.2.5 / 2016-05-06
|
2
|
+
|
3
|
+
* Updated Highcharts to 4.2.5 (2016-05-06)
|
4
|
+
* Added new option, exporting.printMaxWidth, to prevent printed charts cut off on the right side. Closes #2088.
|
5
|
+
* Added new option, title.widthAdjust and subtitle.widthAdjust, to prevent titles from flowing over elements.
|
6
|
+
* Added support for JPEG in offline download module, ref #5157
|
7
|
+
* Fixed #3070, verticalAlign didn't work with rotated data labels on column series.
|
8
|
+
* Fixed #4087, error 11 was not described on the website.
|
9
|
+
* Fixed #4670, zones colors were not applied for markers on hover.
|
10
|
+
* Fixed #5211, titleSetter in combination with buildText added duplicate content to the title.
|
11
|
+
* Fixed #5220, a regression causing JS error when resizing polar charts.
|
12
|
+
* Fixed #5221, support for minPointLength in xrange study.
|
13
|
+
* Fixed #5226, polar chart with no data failed with error.
|
14
|
+
* Fixed #5228, scroller.getUnionExtremes did not consider navigation axis min and max.
|
15
|
+
* Fixed #5230, a horizontal and opposite axis used to have wrong alignment for its title.
|
16
|
+
* Fixed #5234, x value of null cancelled rendering of all points.
|
17
|
+
* Fixed #5236, last point was not always visible due to rounding errors.
|
18
|
+
* Fixed #5237, inverted should not have an effect on polar charts.
|
19
|
+
* Fixed #5250, columns were not visible in IE10.
|
20
|
+
* Fixed #5254, data labels were not aligned to the point box in heatmaps.
|
21
|
+
* Fixed #5259, crosshair prevented point hover when drawn above points.
|
22
|
+
* Fixed #5261, break at the end of a label caused wrong bounding box.
|
23
|
+
* Fixed #5266, pinchDown was sometimes empty on Android.
|
24
|
+
* Fixed #5269, crosshairs on wrong point with multiple series and non-shared tooltip.
|
25
|
+
* Fixed #5274, dataLabels.overflow not always respected on heatmaps.
|
26
|
+
* Fixed issue in the xrange study with axis extremes when there were other, more extended series in the same chart.
|
27
|
+
|
1
28
|
# 4.2.4 / 2016-05-06
|
2
29
|
|
3
|
-
* Updated Highcharts to 4.2.4
|
30
|
+
* Updated Highcharts to 4.2.4 (2016-04-14)
|
4
31
|
* Added support for polar columnrange series.
|
5
32
|
* Added e.originalEvent to drilldown event in order to catch modifier keys and other properties. Closes #5113.
|
6
33
|
* Added new drilldown event, chart.events.drillupall, that is triggered after multiple single drillup events. Closes #5158. Closes #5159.
|
@@ -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.5 (2016-05-06)
|
6
6
|
*
|
7
7
|
* (c) 2009-2016 Torstein Honsi
|
8
8
|
*
|
@@ -59,7 +59,7 @@
|
|
59
59
|
charts = [],
|
60
60
|
chartCount = 0,
|
61
61
|
PRODUCT = 'Highcharts',
|
62
|
-
VERSION = '4.2.
|
62
|
+
VERSION = '4.2.5',
|
63
63
|
|
64
64
|
// some constants for frequently used strings
|
65
65
|
DIV = 'div',
|
@@ -482,9 +482,9 @@
|
|
482
482
|
* Check for number
|
483
483
|
* @param {Object} n
|
484
484
|
*/
|
485
|
-
function isNumber(n) {
|
486
|
-
return typeof n === 'number';
|
487
|
-
}
|
485
|
+
var isNumber = Highcharts.isNumber = function isNumber(n) {
|
486
|
+
return typeof n === 'number' && !isNaN(n);
|
487
|
+
};
|
488
488
|
|
489
489
|
/**
|
490
490
|
* Remove last occurence of an item from an array
|
@@ -676,7 +676,7 @@
|
|
676
676
|
* @param {Boolean} capitalize
|
677
677
|
*/
|
678
678
|
dateFormat = function (format, timestamp, capitalize) {
|
679
|
-
if (!
|
679
|
+
if (!isNumber(timestamp)) {
|
680
680
|
return defaultOptions.lang.invalidDate || '';
|
681
681
|
}
|
682
682
|
format = pick(format, '%Y-%m-%d %H:%M:%S');
|
@@ -1019,6 +1019,7 @@
|
|
1019
1019
|
Highcharts.numberFormat = function (number, decimals, decimalPoint, thousandsSep) {
|
1020
1020
|
|
1021
1021
|
number = +number || 0;
|
1022
|
+
decimals = +decimals;
|
1022
1023
|
|
1023
1024
|
var lang = defaultOptions.lang,
|
1024
1025
|
origDec = (number.toString().split('.')[1] || '').length,
|
@@ -1030,7 +1031,7 @@
|
|
1030
1031
|
|
1031
1032
|
if (decimals === -1) {
|
1032
1033
|
decimals = Math.min(origDec, 20); // Preserve decimals. Not huge numbers (#3793).
|
1033
|
-
} else if (
|
1034
|
+
} else if (!isNumber(decimals)) {
|
1034
1035
|
decimals = 2;
|
1035
1036
|
}
|
1036
1037
|
|
@@ -1055,7 +1056,7 @@
|
|
1055
1056
|
ret += strinteger.substr(thousands).replace(/(\d{3})(?=\d)/g, '$1' + thousandsSep);
|
1056
1057
|
|
1057
1058
|
// Add the decimal point and the decimal component
|
1058
|
-
if (
|
1059
|
+
if (decimals) {
|
1059
1060
|
// Get the decimal component, and add power to avoid rounding errors with float numbers (#4573)
|
1060
1061
|
decimalComponent = Math.abs(absNumber - strinteger + Math.pow(10, -Math.max(decimals, origDec) - 1));
|
1061
1062
|
ret += decimalPoint + decimalComponent.toFixed(decimals).slice(2);
|
@@ -1534,7 +1535,7 @@
|
|
1534
1535
|
useUTC: true,
|
1535
1536
|
//timezoneOffset: 0,
|
1536
1537
|
canvasToolsURL: 'http://code.highcharts.com/modules/canvas-tools.js',
|
1537
|
-
VMLRadialGradientURL: 'http://code.highcharts.com/4.2.
|
1538
|
+
VMLRadialGradientURL: 'http://code.highcharts.com/4.2.5/gfx/vml-radial-gradient.png'
|
1538
1539
|
},
|
1539
1540
|
chart: {
|
1540
1541
|
//animation: true,
|
@@ -1593,7 +1594,8 @@
|
|
1593
1594
|
style: {
|
1594
1595
|
color: '#333333',
|
1595
1596
|
fontSize: '18px'
|
1596
|
-
}
|
1597
|
+
},
|
1598
|
+
widthAdjust: -44
|
1597
1599
|
|
1598
1600
|
},
|
1599
1601
|
subtitle: {
|
@@ -1605,7 +1607,8 @@
|
|
1605
1607
|
// y: null,
|
1606
1608
|
style: {
|
1607
1609
|
color: '#555555'
|
1608
|
-
}
|
1610
|
+
},
|
1611
|
+
widthAdjust: -44
|
1609
1612
|
},
|
1610
1613
|
|
1611
1614
|
plotOptions: {
|
@@ -2016,7 +2019,7 @@
|
|
2016
2019
|
});
|
2017
2020
|
|
2018
2021
|
// it's NaN if gradient colors on a column chart
|
2019
|
-
} else if (rgba &&
|
2022
|
+
} else if (rgba && isNumber(rgba[0])) {
|
2020
2023
|
if (format === 'rgb' || (!format && rgba[3] === 1)) {
|
2021
2024
|
ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';
|
2022
2025
|
} else if (format === 'a') {
|
@@ -3179,6 +3182,12 @@
|
|
3179
3182
|
titleNode = doc.createElementNS(SVG_NS, 'title');
|
3180
3183
|
this.element.appendChild(titleNode);
|
3181
3184
|
}
|
3185
|
+
|
3186
|
+
// Remove text content if it exists
|
3187
|
+
if (titleNode.firstChild) {
|
3188
|
+
titleNode.removeChild(titleNode.firstChild);
|
3189
|
+
}
|
3190
|
+
|
3182
3191
|
titleNode.appendChild(
|
3183
3192
|
doc.createTextNode(
|
3184
3193
|
(String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895
|
@@ -3474,6 +3483,7 @@
|
|
3474
3483
|
childNodes = textNode.childNodes,
|
3475
3484
|
styleRegex,
|
3476
3485
|
hrefRegex,
|
3486
|
+
wasTooLong,
|
3477
3487
|
parentX = attr(textNode, 'x'),
|
3478
3488
|
textStyles = wrapper.styles,
|
3479
3489
|
width = wrapper.textWidth,
|
@@ -3529,18 +3539,20 @@
|
|
3529
3539
|
}
|
3530
3540
|
|
3531
3541
|
|
3532
|
-
//
|
3533
|
-
|
3534
|
-
|
3535
|
-
}
|
3542
|
+
// Trim empty lines (#5261)
|
3543
|
+
lines = grep(lines, function (line) {
|
3544
|
+
return line !== '';
|
3545
|
+
});
|
3536
3546
|
|
3537
3547
|
|
3538
3548
|
// build the lines
|
3539
3549
|
each(lines, function buildTextLines(line, lineNo) {
|
3540
3550
|
var spans,
|
3541
3551
|
spanNo = 0;
|
3542
|
-
|
3543
|
-
|
3552
|
+
line = line
|
3553
|
+
.replace(/^\s+|\s+$/g, '') // Trim to prevent useless/costly process on the spaces (#5258)
|
3554
|
+
.replace(/<span/g, '|||<span')
|
3555
|
+
.replace(/<\/span>/g, '</span>|||');
|
3544
3556
|
spans = line.split('|||');
|
3545
3557
|
|
3546
3558
|
each(spans, function buildTextSpans(span) {
|
@@ -3605,7 +3617,6 @@
|
|
3605
3617
|
var words = span.replace(/([^\^])-/g, '$1- ').split(' '), // #1273
|
3606
3618
|
hasWhiteSpace = spans.length > 1 || lineNo || (words.length > 1 && textStyles.whiteSpace !== 'nowrap'),
|
3607
3619
|
tooLong,
|
3608
|
-
wasTooLong,
|
3609
3620
|
actualWidth,
|
3610
3621
|
rest = [],
|
3611
3622
|
dy = getLineHeight(tspan),
|
@@ -3637,9 +3648,6 @@
|
|
3637
3648
|
if (wordStr === '' || (!tooLong && cursor < 0.5)) {
|
3638
3649
|
words = []; // All ok, break out
|
3639
3650
|
} else {
|
3640
|
-
if (tooLong) {
|
3641
|
-
wasTooLong = true;
|
3642
|
-
}
|
3643
3651
|
wordStr = span.substring(0, wordStr.length + (tooLong ? -1 : 1) * mathCeil(cursor));
|
3644
3652
|
words = [wordStr + (width > 3 ? '\u2026' : '')];
|
3645
3653
|
tspan.removeChild(tspan.firstChild);
|
@@ -3675,9 +3683,6 @@
|
|
3675
3683
|
tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));
|
3676
3684
|
}
|
3677
3685
|
}
|
3678
|
-
if (wasTooLong) {
|
3679
|
-
wrapper.attr('title', wrapper.textStr);
|
3680
|
-
}
|
3681
3686
|
wrapper.rotation = rotation;
|
3682
3687
|
}
|
3683
3688
|
|
@@ -3686,6 +3691,10 @@
|
|
3686
3691
|
}
|
3687
3692
|
});
|
3688
3693
|
});
|
3694
|
+
|
3695
|
+
if (wasTooLong) {
|
3696
|
+
wrapper.attr('title', wrapper.textStr);
|
3697
|
+
}
|
3689
3698
|
if (tempParent) {
|
3690
3699
|
tempParent.removeChild(textNode); // attach it to the DOM to read offset width
|
3691
3700
|
}
|
@@ -6576,7 +6585,7 @@
|
|
6576
6585
|
}
|
6577
6586
|
|
6578
6587
|
// the label is created on init - now move it into place
|
6579
|
-
if (label &&
|
6588
|
+
if (label && isNumber(x)) {
|
6580
6589
|
label.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);
|
6581
6590
|
|
6582
6591
|
// Apply show first and show last. If the tick is both first and last, it is
|
@@ -6597,7 +6606,7 @@
|
|
6597
6606
|
}
|
6598
6607
|
|
6599
6608
|
// Set the new position, and show or hide
|
6600
|
-
if (show &&
|
6609
|
+
if (show && isNumber(xy.y)) {
|
6601
6610
|
xy.opacity = opacity;
|
6602
6611
|
label[tick.isNew ? 'attr' : 'animate'](xy);
|
6603
6612
|
tick.isNew = false;
|
@@ -7347,8 +7356,20 @@
|
|
7347
7356
|
if (axis.isXAxis) {
|
7348
7357
|
xData = series.xData;
|
7349
7358
|
if (xData.length) {
|
7350
|
-
|
7359
|
+
// If xData contains values which is not numbers, then filter them out.
|
7360
|
+
// To prevent performance hit, we only do this after we have already
|
7361
|
+
// found seriesDataMin because in most cases all data is valid. #5234.
|
7362
|
+
seriesDataMin = arrayMin(xData);
|
7363
|
+
if (!isNumber(seriesDataMin) && !(seriesDataMin instanceof Date)) { // Date for #5010
|
7364
|
+
xData = grep(xData, function (x) {
|
7365
|
+
return isNumber(x);
|
7366
|
+
});
|
7367
|
+
seriesDataMin = arrayMin(xData); // Do it again with valid data
|
7368
|
+
}
|
7369
|
+
|
7370
|
+
axis.dataMin = mathMin(pick(axis.dataMin, xData[0]), seriesDataMin);
|
7351
7371
|
axis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));
|
7372
|
+
|
7352
7373
|
}
|
7353
7374
|
|
7354
7375
|
// Get dataMin and dataMax for Y axes, as well as handle stacking and processed data
|
@@ -7494,8 +7515,7 @@
|
|
7494
7515
|
translatedValue = pick(translatedValue, axis.translate(value, null, null, old));
|
7495
7516
|
x1 = x2 = mathRound(translatedValue + transB);
|
7496
7517
|
y1 = y2 = mathRound(cHeight - translatedValue - transB);
|
7497
|
-
|
7498
|
-
if (isNaN(translatedValue)) { // no min or max
|
7518
|
+
if (!isNumber(translatedValue)) { // no min or max
|
7499
7519
|
skip = true;
|
7500
7520
|
|
7501
7521
|
} else if (axis.horiz) {
|
@@ -7862,6 +7882,9 @@
|
|
7862
7882
|
axis.range = null; // don't use it when running setExtremes
|
7863
7883
|
}
|
7864
7884
|
|
7885
|
+
// Hook for Highstock Scroller. Consider combining with beforePadding.
|
7886
|
+
fireEvent(axis, 'foundExtremes');
|
7887
|
+
|
7865
7888
|
// Hook for adjusting this.min and this.max. Used by bubble series.
|
7866
7889
|
if (axis.beforePadding) {
|
7867
7890
|
axis.beforePadding();
|
@@ -8674,6 +8697,7 @@
|
|
8674
8697
|
clip,
|
8675
8698
|
directionFactor = [-1, 1, 1, -1][side],
|
8676
8699
|
n,
|
8700
|
+
textAlign,
|
8677
8701
|
axisParent = axis.axisParent, // Used in color axis
|
8678
8702
|
lineHeightCorrection,
|
8679
8703
|
tickSize = this.tickSize('tick');
|
@@ -8741,6 +8765,18 @@
|
|
8741
8765
|
|
8742
8766
|
if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {
|
8743
8767
|
if (!axis.axisTitle) {
|
8768
|
+
textAlign = axisTitleOptions.textAlign;
|
8769
|
+
if (!textAlign) {
|
8770
|
+
textAlign = (horiz ? {
|
8771
|
+
low: 'left',
|
8772
|
+
middle: 'center',
|
8773
|
+
high: 'right'
|
8774
|
+
} : {
|
8775
|
+
low: opposite ? 'right' : 'left',
|
8776
|
+
middle: 'center',
|
8777
|
+
high: opposite ? 'left' : 'right'
|
8778
|
+
})[axisTitleOptions.align];
|
8779
|
+
}
|
8744
8780
|
axis.axisTitle = renderer.text(
|
8745
8781
|
axisTitleOptions.text,
|
8746
8782
|
0,
|
@@ -8750,12 +8786,7 @@
|
|
8750
8786
|
.attr({
|
8751
8787
|
zIndex: 7,
|
8752
8788
|
rotation: axisTitleOptions.rotation || 0,
|
8753
|
-
align:
|
8754
|
-
axisTitleOptions.textAlign || {
|
8755
|
-
low: opposite ? 'right' : 'left',
|
8756
|
-
middle: 'center',
|
8757
|
-
high: opposite ? 'left' : 'right'
|
8758
|
-
}[axisTitleOptions.align]
|
8789
|
+
align: textAlign
|
8759
8790
|
})
|
8760
8791
|
.addClass(PREFIX + this.coll.toLowerCase() + '-title')
|
8761
8792
|
.css(axisTitleOptions.style)
|
@@ -8902,7 +8933,7 @@
|
|
8902
8933
|
lineWidth = options.lineWidth,
|
8903
8934
|
linePath,
|
8904
8935
|
hasRendered = chart.hasRendered,
|
8905
|
-
slideInTicks = hasRendered &&
|
8936
|
+
slideInTicks = hasRendered && isNumber(axis.oldMin),
|
8906
8937
|
showAxis = axis.showAxis,
|
8907
8938
|
animation = animObject(renderer.globalAnimation),
|
8908
8939
|
from,
|
@@ -9198,6 +9229,7 @@
|
|
9198
9229
|
});
|
9199
9230
|
} else {
|
9200
9231
|
attribs = {
|
9232
|
+
'pointer-events': 'none', // #5259
|
9201
9233
|
'stroke-width': strokeWidth,
|
9202
9234
|
stroke: options.color || (categorized ? 'rgba(155,200,255,0.2)' : '#C0C0C0'),
|
9203
9235
|
zIndex: pick(options.zIndex, 2)
|
@@ -10233,7 +10265,7 @@
|
|
10233
10265
|
if (p) {
|
10234
10266
|
// Store both closest points, using point.dist and point.distX comparisons (#4645):
|
10235
10267
|
each(['dist', 'distX'], function (dist, k) {
|
10236
|
-
if (
|
10268
|
+
if (isNumber(p[dist])) {
|
10237
10269
|
var
|
10238
10270
|
// It is closer than the reference point
|
10239
10271
|
isCloser = p[dist] < distance[k],
|
@@ -10304,7 +10336,7 @@
|
|
10304
10336
|
|
10305
10337
|
// Crosshair. For each hover point, loop over axes and draw cross if that point
|
10306
10338
|
// belongs to the axis (#4927).
|
10307
|
-
each(shared ? kdpoints : [pick(kdpoint[1]
|
10339
|
+
each(shared ? kdpoints : [pick(hoverPoint, kdpoint[1])], function (point) { // #5269
|
10308
10340
|
each(chart.axes, function (axis) {
|
10309
10341
|
// In case of snap = false, point is undefined, and we draw the crosshair anyway (#5066)
|
10310
10342
|
if (!point || point.series[axis.coll] === axis) {
|
@@ -10995,10 +11027,10 @@
|
|
10995
11027
|
// moved, and cancelling on small distances. #3450.
|
10996
11028
|
if (e.type === 'touchmove') {
|
10997
11029
|
pinchDown = this.pinchDown;
|
10998
|
-
hasMoved = Math.sqrt(
|
11030
|
+
hasMoved = pinchDown[0] ? Math.sqrt( // #5266
|
10999
11031
|
Math.pow(pinchDown[0].chartX - e.chartX, 2) +
|
11000
11032
|
Math.pow(pinchDown[0].chartY - e.chartY, 2)
|
11001
|
-
) >= 4;
|
11033
|
+
) >= 4 : false;
|
11002
11034
|
}
|
11003
11035
|
|
11004
11036
|
if (pick(hasMoved, true)) {
|
@@ -12169,6 +12201,9 @@
|
|
12169
12201
|
redrawLegend = true;
|
12170
12202
|
}
|
12171
12203
|
}
|
12204
|
+
if (serie.isDirtyData) {
|
12205
|
+
fireEvent(serie, 'updatedData');
|
12206
|
+
}
|
12172
12207
|
});
|
12173
12208
|
|
12174
12209
|
// handle added or removed series
|
@@ -12395,6 +12430,7 @@
|
|
12395
12430
|
})
|
12396
12431
|
.css(chartTitleOptions.style)
|
12397
12432
|
.add();
|
12433
|
+
|
12398
12434
|
}
|
12399
12435
|
});
|
12400
12436
|
chart.layOutTitles(redraw);
|
@@ -12412,14 +12448,14 @@
|
|
12412
12448
|
subtitleOptions = options.subtitle,
|
12413
12449
|
requiresDirtyBox,
|
12414
12450
|
renderer = this.renderer,
|
12415
|
-
|
12451
|
+
spacingBox = this.spacingBox;
|
12416
12452
|
|
12417
12453
|
if (title) {
|
12418
12454
|
title
|
12419
|
-
.css({ width: (titleOptions.width ||
|
12455
|
+
.css({ width: (titleOptions.width || spacingBox.width + titleOptions.widthAdjust) + PX })
|
12420
12456
|
.align(extend({
|
12421
12457
|
y: renderer.fontMetrics(titleOptions.style.fontSize, title).b - 3
|
12422
|
-
}, titleOptions), false,
|
12458
|
+
}, titleOptions), false, spacingBox);
|
12423
12459
|
|
12424
12460
|
if (!titleOptions.floating && !titleOptions.verticalAlign) {
|
12425
12461
|
titleOffset = title.getBBox().height;
|
@@ -12427,10 +12463,10 @@
|
|
12427
12463
|
}
|
12428
12464
|
if (subtitle) {
|
12429
12465
|
subtitle
|
12430
|
-
.css({ width: (subtitleOptions.width ||
|
12466
|
+
.css({ width: (subtitleOptions.width || spacingBox.width + subtitleOptions.widthAdjust) + PX })
|
12431
12467
|
.align(extend({
|
12432
12468
|
y: titleOffset + (titleOptions.margin - 13) + renderer.fontMetrics(subtitleOptions.style.fontSize, title).b
|
12433
|
-
}, subtitleOptions), false,
|
12469
|
+
}, subtitleOptions), false, spacingBox);
|
12434
12470
|
|
12435
12471
|
if (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {
|
12436
12472
|
titleOffset = mathCeil(titleOffset + subtitle.getBBox().height);
|
@@ -12545,7 +12581,7 @@
|
|
12545
12581
|
// attribute and the SVG contents, but not an interactive chart. So in this case,
|
12546
12582
|
// charts[oldChartIndex] will point to the wrong chart if any (#2609).
|
12547
12583
|
oldChartIndex = pInt(attr(renderTo, indexAttrName));
|
12548
|
-
if (
|
12584
|
+
if (isNumber(oldChartIndex) && charts[oldChartIndex] && charts[oldChartIndex].hasRendered) {
|
12549
12585
|
charts[oldChartIndex].destroy();
|
12550
12586
|
}
|
12551
12587
|
|
@@ -13473,7 +13509,7 @@
|
|
13473
13509
|
if (pointValKey) {
|
13474
13510
|
point.y = point[pointValKey];
|
13475
13511
|
}
|
13476
|
-
point.isNull = point.y === null;
|
13512
|
+
point.isNull = point.x === null || point.y === null;
|
13477
13513
|
|
13478
13514
|
// If no x is set by now, get auto incremented value. All points must have an
|
13479
13515
|
// x value, however the y value can be null to create a gap in the series
|
@@ -13497,7 +13533,7 @@
|
|
13497
13533
|
i = 0,
|
13498
13534
|
j = 0;
|
13499
13535
|
|
13500
|
-
if (
|
13536
|
+
if (isNumber(options) || options === null) {
|
13501
13537
|
ret[pointArrayMap[0]] = options;
|
13502
13538
|
|
13503
13539
|
} else if (isArray(options)) {
|
@@ -13827,7 +13863,7 @@
|
|
13827
13863
|
updateParallelArrays: function (point, i) {
|
13828
13864
|
var series = point.series,
|
13829
13865
|
args = arguments,
|
13830
|
-
fn =
|
13866
|
+
fn = isNumber(i) ?
|
13831
13867
|
// Insert the value in the given position
|
13832
13868
|
function (key) {
|
13833
13869
|
var val = key === 'y' && series.toYData ? series.toYData(point) : point[key];
|
@@ -14325,7 +14361,7 @@
|
|
14325
14361
|
i,
|
14326
14362
|
j;
|
14327
14363
|
|
14328
|
-
yData = yData || this.stackedYData || this.processedYData;
|
14364
|
+
yData = yData || this.stackedYData || this.processedYData || [];
|
14329
14365
|
yDataLength = yData.length;
|
14330
14366
|
|
14331
14367
|
for (i = 0; i < yDataLength; i++) {
|
@@ -14403,8 +14439,9 @@
|
|
14403
14439
|
}
|
14404
14440
|
|
14405
14441
|
// Get the plotX translation
|
14406
|
-
point.plotX = plotX =
|
14407
|
-
|
14442
|
+
point.plotX = plotX = correctFloat( // #5236
|
14443
|
+
mathMin(mathMax(-1e5, xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags')), 1e5) // #3923
|
14444
|
+
);
|
14408
14445
|
|
14409
14446
|
// Calculate the bottom y value for stacked series
|
14410
14447
|
if (stacking && series.visible && !point.isNull && stack && stack[xValue]) {
|
@@ -14632,7 +14669,7 @@
|
|
14632
14669
|
isInside = point.isInside;
|
14633
14670
|
|
14634
14671
|
// only draw the point if y is defined
|
14635
|
-
if (enabled &&
|
14672
|
+
if (enabled && isNumber(plotY) && point.y !== null) {
|
14636
14673
|
|
14637
14674
|
// shortcuts
|
14638
14675
|
pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE] || seriesPointAttr;
|
@@ -14730,6 +14767,7 @@
|
|
14730
14767
|
turboThreshold = seriesOptions.turboThreshold,
|
14731
14768
|
zones = series.zones,
|
14732
14769
|
zoneAxis = series.zoneAxis || 'y',
|
14770
|
+
zoneColor,
|
14733
14771
|
attr,
|
14734
14772
|
key;
|
14735
14773
|
|
@@ -14778,6 +14816,7 @@
|
|
14778
14816
|
normalOptions.radius = 0;
|
14779
14817
|
}
|
14780
14818
|
|
14819
|
+
zoneColor = null;
|
14781
14820
|
if (zones.length) {
|
14782
14821
|
j = 0;
|
14783
14822
|
threshold = zones[j];
|
@@ -14785,7 +14824,7 @@
|
|
14785
14824
|
threshold = zones[++j];
|
14786
14825
|
}
|
14787
14826
|
|
14788
|
-
point.color = point.fillColor = pick(threshold.color, series.color); // #3636, #4267, #4430 - inherit color from series, when color is undefined
|
14827
|
+
point.color = point.fillColor = zoneColor = pick(threshold.color, series.color); // #3636, #4267, #4430 - inherit color from series, when color is undefined
|
14789
14828
|
|
14790
14829
|
}
|
14791
14830
|
|
@@ -14829,6 +14868,12 @@
|
|
14829
14868
|
if (normalOptions.hasOwnProperty('color') && !normalOptions.color) {
|
14830
14869
|
delete normalOptions.color;
|
14831
14870
|
}
|
14871
|
+
|
14872
|
+
// When zone is set, but series.states.hover.color is not set, apply zone color on hover, #4670:
|
14873
|
+
if (zoneColor && !stateOptionsHover.fillColor) {
|
14874
|
+
pointStateOptionsHover.fillColor = zoneColor;
|
14875
|
+
}
|
14876
|
+
|
14832
14877
|
pointAttr[NORMAL_STATE] = series.convertAttribs(extend(attr, normalOptions), seriesPointAttr[NORMAL_STATE]);
|
14833
14878
|
|
14834
14879
|
// inherit from point normal and series hover
|
@@ -15386,8 +15431,7 @@
|
|
15386
15431
|
redraw: function () {
|
15387
15432
|
var series = this,
|
15388
15433
|
chart = series.chart,
|
15389
|
-
|
15390
|
-
wasDirty = series.isDirty,
|
15434
|
+
wasDirty = series.isDirty || series.isDirtyData, // cache it here as it is set to false in render, but used after
|
15391
15435
|
group = series.group,
|
15392
15436
|
xAxis = series.xAxis,
|
15393
15437
|
yAxis = series.yAxis;
|
@@ -15409,11 +15453,8 @@
|
|
15409
15453
|
|
15410
15454
|
series.translate();
|
15411
15455
|
series.render();
|
15412
|
-
if (
|
15413
|
-
|
15414
|
-
}
|
15415
|
-
if (wasDirty || wasDirtyData) { // #3945 recalculate the kdtree when dirty
|
15416
|
-
delete this.kdTree; // #3868 recalculate the kdtree with dirty data
|
15456
|
+
if (wasDirty) { // #3868, #3945
|
15457
|
+
delete this.kdTree;
|
15417
15458
|
}
|
15418
15459
|
},
|
15419
15460
|
|
@@ -17207,7 +17248,7 @@
|
|
17207
17248
|
graphic = point.graphic,
|
17208
17249
|
borderAttr;
|
17209
17250
|
|
17210
|
-
if (
|
17251
|
+
if (isNumber(plotY) && point.y !== null) {
|
17211
17252
|
shapeArgs = point.shapeArgs;
|
17212
17253
|
|
17213
17254
|
borderAttr = defined(series.borderWidth) ? {
|
@@ -17264,7 +17305,7 @@
|
|
17264
17305
|
// Do the scale synchronously to ensure smooth updating (#5030)
|
17265
17306
|
step: function (val, fx) {
|
17266
17307
|
series.group.attr({
|
17267
|
-
scaleY: fx.pos
|
17308
|
+
scaleY: mathMax(0.001, fx.pos) // #5250
|
17268
17309
|
});
|
17269
17310
|
}
|
17270
17311
|
}));
|
@@ -18015,11 +18056,11 @@
|
|
18015
18056
|
rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723
|
18016
18057
|
alignAttr = {
|
18017
18058
|
x: alignTo.x + options.x + alignTo.width / 2 + rotCorr.x,
|
18018
|
-
y: alignTo.y + options.y + alignTo.height
|
18059
|
+
y: alignTo.y + options.y + { top: 0, middle: 0.5, bottom: 1 }[options.verticalAlign] * alignTo.height
|
18019
18060
|
};
|
18020
18061
|
dataLabel[isNew ? 'attr' : 'animate'](alignAttr)
|
18021
18062
|
.attr({ // #3003
|
18022
|
-
align:
|
18063
|
+
align: align
|
18023
18064
|
});
|
18024
18065
|
|
18025
18066
|
// Compensate for the rotated label sticking out on the sides
|
@@ -18246,7 +18287,7 @@
|
|
18246
18287
|
var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),
|
18247
18288
|
slotY = pos + chart.plotTop;
|
18248
18289
|
|
18249
|
-
if (
|
18290
|
+
if (isNumber(slotX)) {
|
18250
18291
|
series.slotElements.push(chart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)
|
18251
18292
|
.attr({
|
18252
18293
|
'stroke-width': 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.5 (2016-05-06)
|
6
6
|
*
|
7
7
|
* (c) 2009-2016 Torstein Honsi
|
8
8
|
*
|
@@ -20,6 +20,7 @@ var arrayMin = Highcharts.arrayMin,
|
|
20
20
|
arrayMax = Highcharts.arrayMax,
|
21
21
|
each = Highcharts.each,
|
22
22
|
extend = Highcharts.extend,
|
23
|
+
isNumber = Highcharts.isNumber,
|
23
24
|
merge = Highcharts.merge,
|
24
25
|
map = Highcharts.map,
|
25
26
|
pick = Highcharts.pick,
|
@@ -525,6 +526,12 @@ var arrayMin = Highcharts.arrayMin,
|
|
525
526
|
|
526
527
|
}
|
527
528
|
|
529
|
+
// Disable certain features on angular and polar axes
|
530
|
+
if (angular || polar) {
|
531
|
+
chart.inverted = false;
|
532
|
+
chartOptions.chart.zoomType = null;
|
533
|
+
}
|
534
|
+
|
528
535
|
// Run prototype.init
|
529
536
|
proceed.call(this, chart, userOptions);
|
530
537
|
|
@@ -542,11 +549,6 @@ var arrayMin = Highcharts.arrayMin,
|
|
542
549
|
);
|
543
550
|
paneOptions = pane.options;
|
544
551
|
|
545
|
-
|
546
|
-
// Disable certain features on angular and polar axes
|
547
|
-
chart.inverted = false;
|
548
|
-
chartOptions.chart.zoomType = null;
|
549
|
-
|
550
552
|
// Start and end angle options are
|
551
553
|
// given in degrees relative to top, while internal computations are
|
552
554
|
// in radians relative to right (like SVG).
|
@@ -1144,7 +1146,7 @@ var arrayMin = Highcharts.arrayMin,
|
|
1144
1146
|
rotation = yAxis.startAngleRad + yAxis.translate(point.y, null, null, null, true);
|
1145
1147
|
|
1146
1148
|
// Handle the wrap and overshoot options
|
1147
|
-
if (overshoot
|
1149
|
+
if (isNumber(overshoot)) {
|
1148
1150
|
overshoot = overshoot / 180 * Math.PI;
|
1149
1151
|
rotation = Math.max(yAxis.startAngleRad - overshoot, Math.min(yAxis.endAngleRad + overshoot, rotation));
|
1150
1152
|
|
@@ -2085,7 +2087,7 @@ var arrayMin = Highcharts.arrayMin,
|
|
2085
2087
|
point = data[i];
|
2086
2088
|
radius = radii ? radii[i] : 0; // #1737
|
2087
2089
|
|
2088
|
-
if (
|
2090
|
+
if (isNumber(radius) && radius >= this.minPxSize / 2) {
|
2089
2091
|
// Shape arguments
|
2090
2092
|
point.shapeType = 'circle';
|
2091
2093
|
point.shapeArgs = {
|
@@ -2213,7 +2215,7 @@ var arrayMin = Highcharts.arrayMin,
|
|
2213
2215
|
|
2214
2216
|
if (range > 0) {
|
2215
2217
|
while (i--) {
|
2216
|
-
if (
|
2218
|
+
if (isNumber(data[i]) && axis.dataMin <= data[i] && data[i] <= axis.dataMax) {
|
2217
2219
|
radius = series.radii[i];
|
2218
2220
|
pxMin = Math.min(((data[i] - min) * transA) - radius, pxMin);
|
2219
2221
|
pxMax = Math.max(((data[i] - min) * transA) + radius, pxMax);
|
@@ -2459,8 +2461,8 @@ var arrayMin = Highcharts.arrayMin,
|
|
2459
2461
|
// Connect the path
|
2460
2462
|
if (this.chart.polar) {
|
2461
2463
|
points = points || this.points;
|
2462
|
-
|
2463
|
-
if (this.options.connectEnds !== false && points[0].y !== null) {
|
2464
|
+
|
2465
|
+
if (this.options.connectEnds !== false && points[0] && points[0].y !== null) {
|
2464
2466
|
this.connectEnds = true; // re-used in splines
|
2465
2467
|
points.splice(points.length, 0, points[0]);
|
2466
2468
|
}
|
@@ -2597,7 +2599,9 @@ var arrayMin = Highcharts.arrayMin,
|
|
2597
2599
|
point = points[i];
|
2598
2600
|
start = point.barX + startAngleRad;
|
2599
2601
|
point.shapeType = 'path';
|
2600
|
-
point.shapeArgs =
|
2602
|
+
point.shapeArgs = {
|
2603
|
+
d: this.polarArc(point.yBottom, point.plotY, start, start + point.pointWidth)
|
2604
|
+
};
|
2601
2605
|
// Provide correct plotX, plotY for tooltip
|
2602
2606
|
this.toXY(point);
|
2603
2607
|
point.tooltipPos = [point.plotX, point.plotY];
|
@@ -67,6 +67,7 @@
|
|
67
67
|
addEvent = H.addEvent,
|
68
68
|
fireEvent = H.fireEvent,
|
69
69
|
grep = H.grep,
|
70
|
+
isNumber = H.isNumber,
|
70
71
|
merge = H.merge,
|
71
72
|
pick = H.pick,
|
72
73
|
wrap = H.wrap,
|
@@ -169,8 +170,8 @@
|
|
169
170
|
data = options.data,
|
170
171
|
xAxis = this.xAxis && this.xAxis.options,
|
171
172
|
yAxis = this.yAxis && this.yAxis.options;
|
172
|
-
return data.length > (options.boostThreshold || Number.MAX_VALUE) &&
|
173
|
-
(!checkX || (
|
173
|
+
return data.length > (options.boostThreshold || Number.MAX_VALUE) && isNumber(yAxis.min) && isNumber(yAxis.max) &&
|
174
|
+
(!checkX || (isNumber(xAxis.min) && isNumber(xAxis.max)));
|
174
175
|
},
|
175
176
|
|
176
177
|
/**
|
@@ -275,7 +276,7 @@
|
|
275
276
|
lastPoint,
|
276
277
|
threshold = options.threshold,
|
277
278
|
yBottom = yAxis.getThreshold(threshold),
|
278
|
-
hasThreshold =
|
279
|
+
hasThreshold = isNumber(threshold),
|
279
280
|
translatedThreshold = yBottom,
|
280
281
|
doFill = this.fill,
|
281
282
|
isRange = series.pointArrayMap && series.pointArrayMap.join(',') === 'low,high',
|
@@ -2908,7 +2908,7 @@ if (CanvasRenderingContext2D) {
|
|
2908
2908
|
});
|
2909
2909
|
}
|
2910
2910
|
}/**
|
2911
|
-
* @license Highcharts JS v4.2.
|
2911
|
+
* @license Highcharts JS v4.2.5 (2016-05-06)
|
2912
2912
|
* CanVGRenderer Extension module
|
2913
2913
|
*
|
2914
2914
|
* (c) 2011-2016 Torstein Honsi, Erik Olsson
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.2.
|
2
|
+
* @license Highcharts JS v4.2.5 (2016-05-06)
|
3
3
|
* Data module
|
4
4
|
*
|
5
5
|
* (c) 2012-2016 Torstein Honsi
|
@@ -22,6 +22,7 @@
|
|
22
22
|
each = Highcharts.each,
|
23
23
|
pick = Highcharts.pick,
|
24
24
|
inArray = Highcharts.inArray,
|
25
|
+
isNumber = Highcharts.isNumber,
|
25
26
|
splat = Highcharts.splat,
|
26
27
|
SeriesBuilder;
|
27
28
|
|
@@ -424,7 +425,7 @@
|
|
424
425
|
} else {
|
425
426
|
dateVal = this.parseDate(val);
|
426
427
|
// Only allow parsing of dates if this column is an x-column
|
427
|
-
if (isXColumn &&
|
428
|
+
if (isXColumn && isNumber(dateVal) && columnType !== 'float') { // is date
|
428
429
|
backup[row] = val;
|
429
430
|
column[row] = dateVal;
|
430
431
|
column.isDatetime = true;
|
@@ -557,7 +558,7 @@
|
|
557
558
|
ret = match.getTime() - match.getTimezoneOffset() * 60000;
|
558
559
|
|
559
560
|
// Timestamp
|
560
|
-
} else if (
|
561
|
+
} else if (isNumber(match)) {
|
561
562
|
ret = match - (new Date(match)).getTimezoneOffset() * 60000;
|
562
563
|
}
|
563
564
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.2.
|
2
|
+
* @license Highcharts JS v4.2.5 (2016-05-06)
|
3
3
|
* Exporting module
|
4
4
|
*
|
5
5
|
* (c) 2010-2016 Torstein Honsi
|
@@ -104,6 +104,7 @@ defaultOptions.exporting = {
|
|
104
104
|
type: 'image/png',
|
105
105
|
url: 'http://export.highcharts.com/',
|
106
106
|
//width: undefined,
|
107
|
+
printMaxWidth: 780,
|
107
108
|
//scale: 2
|
108
109
|
buttons: {
|
109
110
|
contextButton: {
|
@@ -424,7 +425,11 @@ extend(Chart.prototype, {
|
|
424
425
|
origDisplay = [],
|
425
426
|
origParent = container.parentNode,
|
426
427
|
body = doc.body,
|
427
|
-
childNodes = body.childNodes
|
428
|
+
childNodes = body.childNodes,
|
429
|
+
printMaxWidth = chart.options.exporting.printMaxWidth,
|
430
|
+
hasUserSize,
|
431
|
+
resetParams,
|
432
|
+
handleMaxWidth;
|
428
433
|
|
429
434
|
if (chart.isPrinting) { // block the button while in printing mode
|
430
435
|
return;
|
@@ -435,6 +440,14 @@ extend(Chart.prototype, {
|
|
435
440
|
|
436
441
|
fireEvent(chart, 'beforePrint');
|
437
442
|
|
443
|
+
// Handle printMaxWidth
|
444
|
+
handleMaxWidth = printMaxWidth && chart.chartWidth > printMaxWidth;
|
445
|
+
if (handleMaxWidth) {
|
446
|
+
hasUserSize = chart.hasUserSize;
|
447
|
+
resetParams = [chart.chartWidth, chart.chartHeight, false];
|
448
|
+
chart.setSize(printMaxWidth, chart.chartHeight, false);
|
449
|
+
}
|
450
|
+
|
438
451
|
// hide all body content
|
439
452
|
each(childNodes, function (node, i) {
|
440
453
|
if (node.nodeType === 1) {
|
@@ -465,6 +478,12 @@ extend(Chart.prototype, {
|
|
465
478
|
|
466
479
|
chart.isPrinting = false;
|
467
480
|
|
481
|
+
// Reset printMaxWidth
|
482
|
+
if (handleMaxWidth) {
|
483
|
+
chart.setSize.apply(chart, resetParams);
|
484
|
+
chart.hasUserSize = hasUserSize;
|
485
|
+
}
|
486
|
+
|
468
487
|
fireEvent(chart, 'afterPrint');
|
469
488
|
|
470
489
|
}, 1000);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.2.
|
2
|
+
* @license Highcharts JS v4.2.5 (2016-05-06)
|
3
3
|
*
|
4
4
|
* (c) 2011-2016 Torstein Honsi
|
5
5
|
*
|
@@ -28,6 +28,7 @@
|
|
28
28
|
each = Highcharts.each,
|
29
29
|
extend = Highcharts.extend,
|
30
30
|
extendClass = Highcharts.extendClass,
|
31
|
+
isNumber = Highcharts.isNumber,
|
31
32
|
merge = Highcharts.merge,
|
32
33
|
pick = Highcharts.pick,
|
33
34
|
seriesTypes = Highcharts.seriesTypes,
|
@@ -383,7 +384,7 @@
|
|
383
384
|
}
|
384
385
|
},
|
385
386
|
getPlotLinePath: function (a, b, c, d, pos) {
|
386
|
-
return
|
387
|
+
return isNumber(pos) ? // crosshairs only // #3969 pos can be 0 !!
|
387
388
|
(this.horiz ?
|
388
389
|
['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] :
|
389
390
|
['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z']
|
@@ -663,10 +664,10 @@
|
|
663
664
|
each(series.points, function (point) {
|
664
665
|
var xPad = (options.colsize || 1) / 2,
|
665
666
|
yPad = (options.rowsize || 1) / 2,
|
666
|
-
x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)),
|
667
|
-
x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)),
|
668
|
-
y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)),
|
669
|
-
y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)),
|
667
|
+
x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),
|
668
|
+
x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), -xAxis.len, 2 * xAxis.len),
|
669
|
+
y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len),
|
670
|
+
y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), -yAxis.len, 2 * yAxis.len);
|
670
671
|
|
671
672
|
// Set plotX and plotY for use in K-D-Tree and more
|
672
673
|
point.plotX = point.clientX = (x1 + x2) / 2;
|
@@ -694,7 +695,7 @@
|
|
694
695
|
animate: noop,
|
695
696
|
getBox: noop,
|
696
697
|
drawLegendSymbol: LegendSymbolMixin.drawRectangle,
|
697
|
-
|
698
|
+
alignDataLabel: seriesTypes.column.prototype.alignDataLabel,
|
698
699
|
getExtremes: function () {
|
699
700
|
// Get the extremes from the value data
|
700
701
|
Series.prototype.getExtremes.call(this, this.valueData);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.2.
|
2
|
+
* @license Highcharts JS v4.2.5 (2016-05-06)
|
3
3
|
* Client side exporting module
|
4
4
|
*
|
5
5
|
* (c) 2015 Torstein Honsi / Oystein Moseng
|
@@ -68,8 +68,8 @@
|
|
68
68
|
},
|
69
69
|
// Get data:URL from image URL
|
70
70
|
// Pass in callbacks to handle results. finallyCallback is always called at the end of the process. Supplying this callback is optional.
|
71
|
-
// All callbacks receive
|
72
|
-
imageToDataUrl = function (imageURL, callbackArgs, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {
|
71
|
+
// All callbacks receive three arguments: imageURL, imageType, and callbackArgs. callbackArgs is used only by callbacks and can contain whatever.
|
72
|
+
imageToDataUrl = function (imageURL, imageType, callbackArgs, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) {
|
73
73
|
var img = new win.Image(),
|
74
74
|
taintedHandler,
|
75
75
|
loadHandler = function () {
|
@@ -78,7 +78,7 @@
|
|
78
78
|
dataURL;
|
79
79
|
try {
|
80
80
|
if (!ctx) {
|
81
|
-
noCanvasSupportCallback(imageURL, callbackArgs);
|
81
|
+
noCanvasSupportCallback(imageURL, imageType, callbackArgs);
|
82
82
|
} else {
|
83
83
|
canvas.height = img.height * scale;
|
84
84
|
canvas.width = img.width * scale;
|
@@ -86,12 +86,12 @@
|
|
86
86
|
|
87
87
|
// Now we try to get the contents of the canvas.
|
88
88
|
try {
|
89
|
-
dataURL = canvas.toDataURL();
|
90
|
-
successCallback(dataURL, callbackArgs);
|
89
|
+
dataURL = canvas.toDataURL(imageType);
|
90
|
+
successCallback(dataURL, imageType, callbackArgs);
|
91
91
|
} catch (e) {
|
92
92
|
// Failed - either tainted canvas or something else went horribly wrong
|
93
93
|
if (e.name === 'SecurityError' || e.name === 'SECURITY_ERR' || e.message === 'SecurityError') {
|
94
|
-
taintedHandler(imageURL, callbackArgs);
|
94
|
+
taintedHandler(imageURL, imageType, callbackArgs);
|
95
95
|
} else {
|
96
96
|
throw e;
|
97
97
|
}
|
@@ -99,15 +99,15 @@
|
|
99
99
|
}
|
100
100
|
} finally {
|
101
101
|
if (finallyCallback) {
|
102
|
-
finallyCallback(imageURL, callbackArgs);
|
102
|
+
finallyCallback(imageURL, imageType, callbackArgs);
|
103
103
|
}
|
104
104
|
}
|
105
105
|
},
|
106
106
|
// Image load failed (e.g. invalid URL)
|
107
107
|
errorHandler = function () {
|
108
|
-
failedLoadCallback(imageURL, callbackArgs);
|
108
|
+
failedLoadCallback(imageURL, imageType, callbackArgs);
|
109
109
|
if (finallyCallback) {
|
110
|
-
finallyCallback(imageURL, callbackArgs);
|
110
|
+
finallyCallback(imageURL, imageType, callbackArgs);
|
111
111
|
}
|
112
112
|
};
|
113
113
|
|
@@ -176,10 +176,12 @@
|
|
176
176
|
initiateDownload = function () {
|
177
177
|
var svgurl,
|
178
178
|
blob,
|
179
|
+
imageType = options && options.type || 'image/png',
|
180
|
+
imageExtension = imageType.split('/')[1],
|
179
181
|
svg = chart.sanitizeSVG(chartCopyContainer.innerHTML); // SVG of chart copy
|
180
182
|
|
181
183
|
// Initiate download depending on file type
|
182
|
-
if (
|
184
|
+
if (imageType === 'image/svg+xml') {
|
183
185
|
// SVG download. In this case, we want to use Microsoft specific Blob if available
|
184
186
|
try {
|
185
187
|
if (nav.msSaveOrOpenBlob) {
|
@@ -194,14 +196,14 @@
|
|
194
196
|
fallbackToExportServer();
|
195
197
|
}
|
196
198
|
} else {
|
197
|
-
// PNG download - create bitmap from SVG
|
199
|
+
// PNG/JPEG download - create bitmap from SVG
|
198
200
|
|
199
201
|
// First, try to get PNG by rendering on canvas
|
200
202
|
svgurl = svgToDataUrl(svg);
|
201
|
-
imageToDataUrl(svgurl, { /* args */ }, function (imageURL) {
|
203
|
+
imageToDataUrl(svgurl, imageType, { /* args */ }, function (imageURL) {
|
202
204
|
// Success
|
203
205
|
try {
|
204
|
-
download(imageURL,
|
206
|
+
download(imageURL, imageExtension);
|
205
207
|
} catch (e) {
|
206
208
|
fallbackToExportServer();
|
207
209
|
}
|
@@ -215,7 +217,7 @@
|
|
215
217
|
downloadWithCanVG = function () {
|
216
218
|
ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight);
|
217
219
|
try {
|
218
|
-
download(nav.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL(
|
220
|
+
download(nav.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL(imageType), imageExtension);
|
219
221
|
} catch (e) {
|
220
222
|
fallbackToExportServer();
|
221
223
|
}
|
@@ -250,7 +252,7 @@
|
|
250
252
|
}
|
251
253
|
},
|
252
254
|
// Success handler, we converted image to base64!
|
253
|
-
embeddedSuccess = function (imageURL, callbackArgs) {
|
255
|
+
embeddedSuccess = function (imageURL, imageType, callbackArgs) {
|
254
256
|
++imagesEmbedded;
|
255
257
|
|
256
258
|
// Change image href in chart copy
|
@@ -281,7 +283,7 @@
|
|
281
283
|
// Go through the images we want to embed
|
282
284
|
for (i = 0, l = images.length; i < l; ++i) {
|
283
285
|
el = images[i];
|
284
|
-
imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), { imageElement: el },
|
286
|
+
imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), 'image/png', { imageElement: el },
|
285
287
|
embeddedSuccess,
|
286
288
|
// Tainted canvas
|
287
289
|
fallbackToExportServer,
|
@@ -309,6 +311,13 @@
|
|
309
311
|
onclick: function () {
|
310
312
|
this.exportChartLocal();
|
311
313
|
}
|
314
|
+
}, {
|
315
|
+
textKey: 'downloadJPEG',
|
316
|
+
onclick: function () {
|
317
|
+
this.exportChartLocal({
|
318
|
+
type: 'image/jpeg'
|
319
|
+
});
|
320
|
+
}
|
312
321
|
}, {
|
313
322
|
textKey: 'downloadSVG',
|
314
323
|
onclick: function () {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v4.2.
|
2
|
+
* @license Highcharts JS v4.2.5 (2016-05-06)
|
3
3
|
* Solid angular gauge module
|
4
4
|
*
|
5
5
|
* (c) 2010-2016 Torstein Honsi
|
@@ -20,6 +20,7 @@
|
|
20
20
|
pInt = H.pInt,
|
21
21
|
pick = H.pick,
|
22
22
|
each = H.each,
|
23
|
+
isNumber = H.isNumber,
|
23
24
|
colorAxisMethods,
|
24
25
|
UNDEFINED;
|
25
26
|
|
@@ -191,7 +192,7 @@
|
|
191
192
|
options = series.options,
|
192
193
|
renderer = series.chart.renderer,
|
193
194
|
overshoot = options.overshoot,
|
194
|
-
overshootVal = overshoot
|
195
|
+
overshootVal = isNumber(overshoot) ? overshoot / 180 * Math.PI : 0;
|
195
196
|
|
196
197
|
H.each(series.points, function (point) {
|
197
198
|
var graphic = point.graphic,
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
// Load the fonts
|
7
7
|
Highcharts.createElement('link', {
|
8
|
-
href: '
|
8
|
+
href: 'https://fonts.googleapis.com/css?family=Unica+One',
|
9
9
|
rel: 'stylesheet',
|
10
10
|
type: 'text/css'
|
11
11
|
}, null, document.getElementsByTagName('head')[0]);
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
// Load the fonts
|
7
7
|
Highcharts.createElement('link', {
|
8
|
-
href: '
|
8
|
+
href: 'https://fonts.googleapis.com/css?family=Dosis:400,600',
|
9
9
|
rel: 'stylesheet',
|
10
10
|
type: 'text/css'
|
11
11
|
}, null, document.getElementsByTagName('head')[0]);
|
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
// Load the fonts
|
7
7
|
Highcharts.createElement('link', {
|
8
|
-
href: '
|
8
|
+
href: 'https://fonts.googleapis.com/css?family=Signika:400,700',
|
9
9
|
rel: 'stylesheet',
|
10
10
|
type: 'text/css'
|
11
11
|
}, null, document.getElementsByTagName('head')[0]);
|
data/lib/highcharts/version.rb
CHANGED