highcharts-rails 4.1.7 → 4.1.8
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 +56 -0
- data/Rakefile +36 -0
- data/app/assets/javascripts/highcharts.js +331 -222
- data/app/assets/javascripts/highcharts/adapters/standalone-framework.js +7 -3
- data/app/assets/javascripts/highcharts/highcharts-3d.js +24 -11
- data/app/assets/javascripts/highcharts/highcharts-more.js +25 -14
- data/app/assets/javascripts/highcharts/modules/boost.js +554 -0
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +17 -10
- 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/exporting.js +32 -7
- data/app/assets/javascripts/highcharts/modules/heatmap.js +24 -5
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +1 -1
- data/app/assets/javascripts/highcharts/modules/offline-exporting.js +276 -0
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +10 -9
- data/app/assets/javascripts/highcharts/modules/treemap.js +1 -1
- data/lib/highcharts/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5d2613cbe4c6a3f1071f83ec6fe79c4f94e6d51
|
4
|
+
data.tar.gz: a505f22fce9e0075c5012d3f5a73dced8940673d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9009c0a9b5bb8bcd42150a35838f3b45ea00917509ae8150b6054004be300301fd3512e3e55b8450217d2b82b8f23290c01a98318ea0a85ab046bf6061cf7201
|
7
|
+
data.tar.gz: bd615ab24486525622bb2e0d3038d49359ec7ddb4d2f478dea63f9fe6d6677672be96b0c5f7d7158a7f40e7982a8b35cade4ce80306e14e598bd5ddd875007cc
|
data/CHANGELOG.markdown
CHANGED
@@ -1,3 +1,59 @@
|
|
1
|
+
# 4.1.8 / 2015-08-31
|
2
|
+
|
3
|
+
* Updated Highcharts to 4.1.8 (2015-08-20)
|
4
|
+
* Added experimental support for using HTML in exported charts through the exporting.allowHTML option. Discussed in #2473.
|
5
|
+
* Added new option, maxPointWidth, to the column chart type and its derivatives.
|
6
|
+
* Add %k, hours with no padding, in dateFormat.
|
7
|
+
* Don't cache undefined bounding box key. Closes #4328.
|
8
|
+
* Fixed #4448, which causes duplicated event calls for column series.
|
9
|
+
* Fixed #1498, minor ticks were missing when using column series.
|
10
|
+
* Fixed #1655, where setExtremes event could be called with undefined extremes.
|
11
|
+
* Fixed #2775, click on custom button propagated and caused JS errors when destroying chart.
|
12
|
+
* Fixed #3379, minPadding and maxPadding was wrong on color axis.
|
13
|
+
* Fixed #3737, points within a group were not reversed in a reversed bar chart X axis.
|
14
|
+
* Fixed #3879, where linked series didn't inherit initial visibility from a parent.
|
15
|
+
* Fixed #3909, HTML data label was invisible after drilling up.
|
16
|
+
* Fixed #4149, tooltip went off plot area when data was clipped.
|
17
|
+
* Fixed #4189, wrong position of the legend in IE7.
|
18
|
+
* Fixed #4219, enconding problem with ellipsis. Better fix for #4079.
|
19
|
+
* Fixed #4246, pie slices with null values should not be rendered.
|
20
|
+
* Fixed #4313, setting one of the extremes removed both, min and max, axis paddings for bubble series.
|
21
|
+
* Fixed #4320, stack items building up and creating memory leak when adding and removing points.
|
22
|
+
* Fixed #4333, data label overlapping detection was too aggressive. Don't handle padding when the label doesn't have a border or background.
|
23
|
+
* Fixed #4339, touch-dragging in IE11 on a zoom enabled chart caused JS errors.
|
24
|
+
* Fixed #4343, axis lines missing when 3D was loaded.
|
25
|
+
* Fixed #4347, legend item click of heatmap with data classes should hide items.
|
26
|
+
* Fixed #4349, updating point.x prevented point from being hidden from legend.
|
27
|
+
* Fixed #4350, pie chart failing with StockChart constructor.
|
28
|
+
* Fixed #4356, pointBreak wasn't called for values below the threshold.
|
29
|
+
* Fixed #4356, series with null threshold now calls breakPoint correctly
|
30
|
+
* Fixed #4359, drilldown pie selected slices had wrong color.
|
31
|
+
* Fixed #4360, float error on logarithmic axis label.
|
32
|
+
* Fixed #4364, chart click event fired when clicking menu items in the export menu.
|
33
|
+
* Fixed #4365, pie chart connectors were not hidden when data labels used HTML and hiding the series.
|
34
|
+
* Fixed #4371, where negative Axis offset miscalculated clip-path for series.
|
35
|
+
* Fixed #4390, JS error in some cases on updating a series with no data.
|
36
|
+
* Fixed #4396, different minSize and maxSize per separate series didn't work.
|
37
|
+
* Fixed #4401, better handling categories based on a point.name.
|
38
|
+
* Fixed #4410, a regression causing incorrect mouseover events in column charts.
|
39
|
+
* Fixed #4411, setting axis.labels.step to 1 didn't result in 1:1 labels.
|
40
|
+
* Fixed #4420, generic X axis gridline width with 3d columns.
|
41
|
+
* Fixed #4421, overlapping upper data labels on arearange series.
|
42
|
+
* Fixed #4430, point color was not set on positive points when negativeColor was set.
|
43
|
+
* Fixed #4434, regression causing failure with reversed solid gauge.
|
44
|
+
* Fixed #4443, auto rotation was not reset after widening chart when labels used HTML.
|
45
|
+
* Fixed #4449, a regression causing wrong alignment on legend items when rtl was combined with useHTML.
|
46
|
+
* Fixed #4477, too dense ticks when setting staggerLines, caused browser crash.
|
47
|
+
* Fixed #4313, setting one of the extremes removed both, min and max, paddings.
|
48
|
+
* Fixed #4351, setSize with standalone adapter didn't resize inner container.
|
49
|
+
* Fixed animation on updating map colors.
|
50
|
+
* Fixed issue with displayNegative not working with all data. Closes #4419
|
51
|
+
* Fixed issue with pie and data labels producing JS error in IE6.
|
52
|
+
* Fixed issue with updating mapbubble point to null.
|
53
|
+
* Fixed regression with JS error on updating pie slice value to null.
|
54
|
+
* Improve logic for pointBreaks, touch #4356
|
55
|
+
* Partial fix for #3861, bubble series not working with logarithmic axes. It now displays, but the bubbles are clipped unless the user sets a padding.
|
56
|
+
|
1
57
|
# 4.1.7 / 2015-08-31
|
2
58
|
|
3
59
|
* Updated Highcharts to 4.1.7 (2015-06-26)
|
data/Rakefile
CHANGED
@@ -1 +1,37 @@
|
|
1
1
|
require 'bundler/gem_tasks'
|
2
|
+
|
3
|
+
desc "Update to the latest version of Highcharts"
|
4
|
+
task :update, :version do |t, args|
|
5
|
+
version = args[:version]
|
6
|
+
url = "http://code.highcharts.com/zips/Highcharts-#{version}.zip"
|
7
|
+
puts "Fetching #{url}"
|
8
|
+
`curl -# #{url} -o tmp/#{version}.zip`
|
9
|
+
`unzip tmp/#{version}.zip -d tmp/#{version}`
|
10
|
+
|
11
|
+
mappings = {
|
12
|
+
"highcharts.src.js" => "highcharts.js",
|
13
|
+
"highcharts-more.src.js" => "highcharts/highcharts-more.js",
|
14
|
+
"highcharts-3d.src.js" => "highcharts/highcharts-3d.js",
|
15
|
+
"standalone-framework.src.js" => "highcharts/adapters/standalone-framework.js",
|
16
|
+
"annotations.src.js" => "highcharts/modules/annotations.js",
|
17
|
+
"canvas-tools.src.js" => "highcharts/modules/canvas-tools.js",
|
18
|
+
"data.src.js" => "highcharts/modules/data.js",
|
19
|
+
"drilldown.src.js" => "highcharts/modules/drilldown.js",
|
20
|
+
"exporting.src.js" => "highcharts/modules/exporting.js",
|
21
|
+
"funnel.src.js" => "highcharts/modules/funnel.js",
|
22
|
+
"heatmap.src.js" => "highcharts/modules/heatmap.js",
|
23
|
+
"no-data-to-display.src.js" => "highcharts/modules/no-data-to-display.js",
|
24
|
+
"solid-gauge.src.js" => "highcharts/modules/solid-gauge.js",
|
25
|
+
"treemap.src.js" => "highcharts/modules/treemap.js",
|
26
|
+
"broken-axis.src.js" => "highcharts/modules/broken-axis.js",
|
27
|
+
"boost.src.js" => "highcharts/modules/boost.js",
|
28
|
+
"offline-exporting.src.js" => "highcharts/modules/offline-exporting.js",
|
29
|
+
}
|
30
|
+
dest = "app/assets/javascripts/"
|
31
|
+
Dir.glob("tmp/#{version}/js/**/*.src.js").each do |file|
|
32
|
+
name = File.basename(file)
|
33
|
+
FileUtils.cp file, "#{dest}#{mappings[name]}", verbose: true
|
34
|
+
end
|
35
|
+
FileUtils.cp Dir.glob("tmp/#{version}/js/themes/*.js"), "#{dest}highcharts/themes/", verbose: true
|
36
|
+
FileUtils.cp Dir.glob("tmp/#{version}/graphics/*.png"), "app/assets/images/highcharts", verbose: true
|
37
|
+
end
|
@@ -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.8 (2015-08-20)
|
6
6
|
*
|
7
7
|
* (c) 2009-2014 Torstein Honsi
|
8
8
|
*
|
@@ -49,14 +49,13 @@ var UNDEFINED,
|
|
49
49
|
garbageBin,
|
50
50
|
defaultOptions,
|
51
51
|
dateFormat, // function
|
52
|
-
globalAnimation,
|
53
52
|
pathAnim,
|
54
53
|
timeUnits,
|
55
54
|
noop = function () { return UNDEFINED; },
|
56
55
|
charts = [],
|
57
56
|
chartCount = 0,
|
58
57
|
PRODUCT = 'Highcharts',
|
59
|
-
VERSION = '4.1.
|
58
|
+
VERSION = '4.1.8',
|
60
59
|
|
61
60
|
// some constants for frequently used strings
|
62
61
|
DIV = 'div',
|
@@ -405,7 +404,7 @@ function getTZOffset(timestamp) {
|
|
405
404
|
*/
|
406
405
|
dateFormat = function (format, timestamp, capitalize) {
|
407
406
|
if (!defined(timestamp) || isNaN(timestamp)) {
|
408
|
-
return
|
407
|
+
return defaultOptions.lang.invalidDate || '';
|
409
408
|
}
|
410
409
|
format = pick(format, '%Y-%m-%d %H:%M:%S');
|
411
410
|
|
@@ -444,6 +443,7 @@ dateFormat = function (format, timestamp, capitalize) {
|
|
444
443
|
|
445
444
|
// Time
|
446
445
|
'H': pad(hours), // Two digits hours in 24h format, 00 through 23
|
446
|
+
'k': hours, // Hours in 24h format, 0 through 23
|
447
447
|
'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11
|
448
448
|
'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12
|
449
449
|
'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59
|
@@ -710,9 +710,9 @@ function error (code, stop) {
|
|
710
710
|
* Fix JS round off float errors
|
711
711
|
* @param {Number} num
|
712
712
|
*/
|
713
|
-
function correctFloat(num) {
|
713
|
+
function correctFloat(num, prec) {
|
714
714
|
return parseFloat(
|
715
|
-
num.toPrecision(14)
|
715
|
+
num.toPrecision(prec || 14)
|
716
716
|
);
|
717
717
|
}
|
718
718
|
|
@@ -723,7 +723,7 @@ function correctFloat(num) {
|
|
723
723
|
* @param {Object} chart
|
724
724
|
*/
|
725
725
|
function setAnimation(animation, chart) {
|
726
|
-
globalAnimation = pick(animation, chart.animation);
|
726
|
+
chart.renderer.globalAnimation = pick(animation, chart.animation);
|
727
727
|
}
|
728
728
|
|
729
729
|
/**
|
@@ -1259,6 +1259,7 @@ defaultOptions = {
|
|
1259
1259
|
'August', 'September', 'October', 'November', 'December'],
|
1260
1260
|
shortMonths: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
|
1261
1261
|
weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
|
1262
|
+
// invalidDate: '',
|
1262
1263
|
decimalPoint: '.',
|
1263
1264
|
numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels
|
1264
1265
|
resetZoom: 'Reset zoom',
|
@@ -1268,8 +1269,8 @@ defaultOptions = {
|
|
1268
1269
|
global: {
|
1269
1270
|
useUTC: true,
|
1270
1271
|
//timezoneOffset: 0,
|
1271
|
-
canvasToolsURL: 'http://code.highcharts.com/4.1.
|
1272
|
-
VMLRadialGradientURL: 'http://code.highcharts.com/4.1.
|
1272
|
+
canvasToolsURL: 'http://code.highcharts.com/4.1.8/modules/canvas-tools.js',
|
1273
|
+
VMLRadialGradientURL: 'http://code.highcharts.com/4.1.8/gfx/vml-radial-gradient.png'
|
1273
1274
|
},
|
1274
1275
|
chart: {
|
1275
1276
|
//animation: true,
|
@@ -1796,7 +1797,7 @@ SVGElement.prototype = {
|
|
1796
1797
|
opacity: 1,
|
1797
1798
|
// For labels, these CSS properties are applied to the <text> node directly
|
1798
1799
|
textProps: ['fontSize', 'fontWeight', 'fontFamily', 'fontStyle', 'color',
|
1799
|
-
'lineHeight', 'width', 'textDecoration', 'textShadow'],
|
1800
|
+
'lineHeight', 'width', 'textDecoration', 'textOverflow', 'textShadow'],
|
1800
1801
|
|
1801
1802
|
/**
|
1802
1803
|
* Initialize the SVG renderer
|
@@ -1818,7 +1819,7 @@ SVGElement.prototype = {
|
|
1818
1819
|
* @param {Function} complete Function to perform at the end of animation
|
1819
1820
|
*/
|
1820
1821
|
animate: function (params, options, complete) {
|
1821
|
-
var animOptions = pick(options, globalAnimation, true);
|
1822
|
+
var animOptions = pick(options, this.renderer.globalAnimation, true);
|
1822
1823
|
stop(this); // stop regardless of animation actually running, or reverting to .attr (#607)
|
1823
1824
|
if (animOptions) {
|
1824
1825
|
animOptions = merge(animOptions, {}); //#2625
|
@@ -1827,10 +1828,7 @@ SVGElement.prototype = {
|
|
1827
1828
|
}
|
1828
1829
|
animate(this, params, animOptions);
|
1829
1830
|
} else {
|
1830
|
-
this.attr(params);
|
1831
|
-
if (complete) {
|
1832
|
-
complete();
|
1833
|
-
}
|
1831
|
+
this.attr(params, null, complete);
|
1834
1832
|
}
|
1835
1833
|
return this;
|
1836
1834
|
},
|
@@ -1943,9 +1941,9 @@ SVGElement.prototype = {
|
|
1943
1941
|
* Apply a polyfill to the text-stroke CSS property, by copying the text element
|
1944
1942
|
* and apply strokes to the copy.
|
1945
1943
|
*
|
1944
|
+
* Contrast checks at http://jsfiddle.net/highcharts/43soe9m1/2/
|
1945
|
+
*
|
1946
1946
|
* docs: update default, document the polyfill and the limitations on hex colors and pixel values, document contrast pseudo-color
|
1947
|
-
* TODO:
|
1948
|
-
* - update defaults
|
1949
1947
|
*/
|
1950
1948
|
applyTextShadow: function (textShadow) {
|
1951
1949
|
var elem = this.element,
|
@@ -2033,7 +2031,7 @@ SVGElement.prototype = {
|
|
2033
2031
|
* @param {Object|String} hash
|
2034
2032
|
* @param {Mixed|Undefined} val
|
2035
2033
|
*/
|
2036
|
-
attr: function (hash, val) {
|
2034
|
+
attr: function (hash, val, complete) {
|
2037
2035
|
var key,
|
2038
2036
|
value,
|
2039
2037
|
element = this.element,
|
@@ -2092,6 +2090,11 @@ SVGElement.prototype = {
|
|
2092
2090
|
|
2093
2091
|
}
|
2094
2092
|
|
2093
|
+
// In accordance with animate, run a complete callback
|
2094
|
+
if (complete) {
|
2095
|
+
complete();
|
2096
|
+
}
|
2097
|
+
|
2095
2098
|
return ret;
|
2096
2099
|
},
|
2097
2100
|
|
@@ -2569,7 +2572,9 @@ SVGElement.prototype = {
|
|
2569
2572
|
}
|
2570
2573
|
|
2571
2574
|
// Cache it
|
2572
|
-
|
2575
|
+
if (cacheKey) {
|
2576
|
+
renderer.cache[cacheKey] = bBox;
|
2577
|
+
}
|
2573
2578
|
}
|
2574
2579
|
return bBox;
|
2575
2580
|
},
|
@@ -2578,13 +2583,7 @@ SVGElement.prototype = {
|
|
2578
2583
|
* Show the element
|
2579
2584
|
*/
|
2580
2585
|
show: function (inherit) {
|
2581
|
-
|
2582
|
-
if (inherit && this.element.namespaceURI === SVG_NS) {
|
2583
|
-
this.element.removeAttribute('visibility');
|
2584
|
-
} else {
|
2585
|
-
this.attr({ visibility: inherit ? 'inherit' : VISIBLE });
|
2586
|
-
}
|
2587
|
-
return this;
|
2586
|
+
return this.attr({ visibility: inherit ? 'inherit' : VISIBLE });
|
2588
2587
|
},
|
2589
2588
|
|
2590
2589
|
/**
|
@@ -2867,6 +2866,14 @@ SVGElement.prototype = {
|
|
2867
2866
|
this.colorGradient(value, key, element);
|
2868
2867
|
}
|
2869
2868
|
},
|
2869
|
+
visibilitySetter: function (value, key, element) {
|
2870
|
+
// IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881, #3909)
|
2871
|
+
if (value === 'inherit') {
|
2872
|
+
element.removeAttribute(key);
|
2873
|
+
} else {
|
2874
|
+
element.setAttribute(key, value);
|
2875
|
+
}
|
2876
|
+
},
|
2870
2877
|
zIndexSetter: function (value, key) {
|
2871
2878
|
var renderer = this.renderer,
|
2872
2879
|
parentGroup = this.parentGroup,
|
@@ -3491,9 +3498,9 @@ SVGRenderer.prototype = {
|
|
3491
3498
|
};
|
3492
3499
|
|
3493
3500
|
return label
|
3494
|
-
.on('click', function () {
|
3501
|
+
.on('click', function (e) {
|
3495
3502
|
if (curState !== 3) {
|
3496
|
-
callback.call(label);
|
3503
|
+
callback.call(label, e);
|
3497
3504
|
}
|
3498
3505
|
})
|
3499
3506
|
.attr(normalState)
|
@@ -4143,7 +4150,11 @@ SVGRenderer.prototype = {
|
|
4143
4150
|
wrapper.box = box = shape ?
|
4144
4151
|
renderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height, deferredAttr) :
|
4145
4152
|
renderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);
|
4146
|
-
|
4153
|
+
|
4154
|
+
if (!box.isImg) { // #4324, fill "none" causes it to be ignored by mouse events in IE
|
4155
|
+
box.attr('fill', NONE);
|
4156
|
+
}
|
4157
|
+
box.add(wrapper);
|
4147
4158
|
}
|
4148
4159
|
|
4149
4160
|
// apply the box attributes
|
@@ -4466,7 +4477,7 @@ extend(SVGElement.prototype, {
|
|
4466
4477
|
rotation = wrapper.rotation,
|
4467
4478
|
baseline,
|
4468
4479
|
textWidth = pInt(wrapper.textWidth),
|
4469
|
-
currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');
|
4480
|
+
currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth, wrapper.textAlign].join(',');
|
4470
4481
|
|
4471
4482
|
if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed
|
4472
4483
|
|
@@ -4551,6 +4562,7 @@ extend(SVGRenderer.prototype, {
|
|
4551
4562
|
delete this.bBox;
|
4552
4563
|
}
|
4553
4564
|
element.innerHTML = this.textStr = value;
|
4565
|
+
wrapper.htmlUpdateTransform();
|
4554
4566
|
};
|
4555
4567
|
|
4556
4568
|
// Various setters which rely on update transform
|
@@ -4638,11 +4650,12 @@ extend(SVGRenderer.prototype, {
|
|
4638
4650
|
htmlGroupStyle.top = value + PX;
|
4639
4651
|
parentGroup[key] = value;
|
4640
4652
|
parentGroup.doTransform = true;
|
4641
|
-
},
|
4642
|
-
visibilitySetter: function (value, key) {
|
4643
|
-
htmlGroupStyle[key] = value;
|
4644
4653
|
}
|
4645
4654
|
});
|
4655
|
+
wrap(parentGroup, 'visibilitySetter', function (proceed, value, key, elem) {
|
4656
|
+
proceed.call(this, value, key, elem);
|
4657
|
+
htmlGroupStyle[key] = value;
|
4658
|
+
});
|
4646
4659
|
});
|
4647
4660
|
|
4648
4661
|
}
|
@@ -6045,7 +6058,7 @@ Tick.prototype = {
|
|
6045
6058
|
gridLineColor = options[gridPrefix + 'LineColor'],
|
6046
6059
|
dashStyle = options[gridPrefix + 'LineDashStyle'],
|
6047
6060
|
tickLength = options[tickPrefix + 'Length'],
|
6048
|
-
tickWidth = options[tickPrefix + 'Width']
|
6061
|
+
tickWidth = pick(options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0), // X axis defaults to 1
|
6049
6062
|
tickColor = options[tickPrefix + 'Color'],
|
6050
6063
|
tickPosition = options[tickPrefix + 'Position'],
|
6051
6064
|
gridLinePath,
|
@@ -6516,7 +6529,7 @@ Axis.prototype = {
|
|
6516
6529
|
tickmarkPlacement: 'between', // on or between
|
6517
6530
|
tickPixelInterval: 100,
|
6518
6531
|
tickPosition: 'outside',
|
6519
|
-
tickWidth: 1,
|
6532
|
+
//tickWidth: 1,
|
6520
6533
|
title: {
|
6521
6534
|
//text: null,
|
6522
6535
|
align: 'middle', // low, middle or high
|
@@ -6548,7 +6561,7 @@ Axis.prototype = {
|
|
6548
6561
|
maxPadding: 0.05,
|
6549
6562
|
minPadding: 0.05,
|
6550
6563
|
startOnTick: true,
|
6551
|
-
tickWidth: 0,
|
6564
|
+
//tickWidth: 0,
|
6552
6565
|
title: {
|
6553
6566
|
rotation: 270,
|
6554
6567
|
text: 'Values'
|
@@ -6634,6 +6647,8 @@ Axis.prototype = {
|
|
6634
6647
|
var isXAxis = userOptions.isX,
|
6635
6648
|
axis = this;
|
6636
6649
|
|
6650
|
+
axis.chart = chart;
|
6651
|
+
|
6637
6652
|
// Flag, is the axis horizontal
|
6638
6653
|
axis.horiz = chart.inverted ? !isXAxis : isXAxis;
|
6639
6654
|
|
@@ -6664,7 +6679,6 @@ Axis.prototype = {
|
|
6664
6679
|
//axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series
|
6665
6680
|
//axis.ignoreMaxPadding = UNDEFINED;
|
6666
6681
|
|
6667
|
-
axis.chart = chart;
|
6668
6682
|
axis.reversed = options.reversed;
|
6669
6683
|
axis.zoomEnabled = options.zoomEnabled !== false;
|
6670
6684
|
|
@@ -6730,7 +6744,8 @@ Axis.prototype = {
|
|
6730
6744
|
// Dictionary for stacks
|
6731
6745
|
axis.stacks = {};
|
6732
6746
|
axis.oldStacks = {};
|
6733
|
-
|
6747
|
+
axis.stacksTouched = 0;
|
6748
|
+
|
6734
6749
|
// Min and max in the data
|
6735
6750
|
//axis.dataMin = UNDEFINED,
|
6736
6751
|
//axis.dataMax = UNDEFINED,
|
@@ -7104,8 +7119,9 @@ Axis.prototype = {
|
|
7104
7119
|
minorTickPositions = [],
|
7105
7120
|
pos,
|
7106
7121
|
i,
|
7107
|
-
|
7108
|
-
|
7122
|
+
pointRangePadding = axis.pointRangePadding || 0,
|
7123
|
+
min = axis.min - pointRangePadding, // #1498
|
7124
|
+
max = axis.max + pointRangePadding, // #1498
|
7109
7125
|
range = max - min,
|
7110
7126
|
len;
|
7111
7127
|
|
@@ -7135,7 +7151,9 @@ Axis.prototype = {
|
|
7135
7151
|
}
|
7136
7152
|
}
|
7137
7153
|
|
7138
|
-
|
7154
|
+
if(minorTickPositions.length !== 0) { // don't change the extremes, when there is no minor ticks
|
7155
|
+
axis.trimTicks(minorTickPositions, options.startOnTick, options.endOnTick); // #3652 #3743 #1498
|
7156
|
+
}
|
7139
7157
|
return minorTickPositions;
|
7140
7158
|
},
|
7141
7159
|
|
@@ -7300,6 +7318,10 @@ Axis.prototype = {
|
|
7300
7318
|
axis.minPixelPadding = transA * minPointOffset;
|
7301
7319
|
},
|
7302
7320
|
|
7321
|
+
minFromRange: function () {
|
7322
|
+
return this.max - this.range;
|
7323
|
+
},
|
7324
|
+
|
7303
7325
|
/**
|
7304
7326
|
* Set the tick positions to round values and optionally extend the extremes
|
7305
7327
|
* to the nearest tick
|
@@ -7343,13 +7365,16 @@ Axis.prototype = {
|
|
7343
7365
|
if (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978
|
7344
7366
|
error(10, 1); // Can't plot negative values on log axis
|
7345
7367
|
}
|
7346
|
-
|
7347
|
-
|
7368
|
+
// The correctFloat cures #934, float errors on full tens. But it
|
7369
|
+
// was too aggressive for #4360 because of conversion back to lin,
|
7370
|
+
// therefore use precision 15.
|
7371
|
+
axis.min = correctFloat(log2lin(axis.min), 15);
|
7372
|
+
axis.max = correctFloat(log2lin(axis.max), 15);
|
7348
7373
|
}
|
7349
7374
|
|
7350
7375
|
// handle zoomed range
|
7351
7376
|
if (axis.range && defined(axis.max)) {
|
7352
|
-
axis.userMin = axis.min = mathMax(axis.min, axis.
|
7377
|
+
axis.userMin = axis.min = mathMax(axis.min, axis.minFromRange()); // #618
|
7353
7378
|
axis.userMax = axis.max;
|
7354
7379
|
|
7355
7380
|
axis.range = null; // don't use it when running setExtremes
|
@@ -7497,6 +7522,11 @@ Axis.prototype = {
|
|
7497
7522
|
tickPositions = this.getLinearTickPositions(this.tickInterval, this.min, this.max);
|
7498
7523
|
}
|
7499
7524
|
|
7525
|
+
// Too dense ticks, keep only the first and last (#4477)
|
7526
|
+
if (tickPositions.length > this.len) {
|
7527
|
+
tickPositions = [tickPositions[0], tickPositions.pop()];
|
7528
|
+
}
|
7529
|
+
|
7500
7530
|
this.tickPositions = tickPositions;
|
7501
7531
|
|
7502
7532
|
// Run the tick positioner callback, that allows modifying auto tick positions.
|
@@ -7653,9 +7683,6 @@ Axis.prototype = {
|
|
7653
7683
|
*/
|
7654
7684
|
setScale: function () {
|
7655
7685
|
var axis = this,
|
7656
|
-
stacks = axis.stacks,
|
7657
|
-
type,
|
7658
|
-
i,
|
7659
7686
|
isDirtyData,
|
7660
7687
|
isDirtyAxisLength;
|
7661
7688
|
|
@@ -7680,14 +7707,8 @@ Axis.prototype = {
|
|
7680
7707
|
if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||
|
7681
7708
|
axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {
|
7682
7709
|
|
7683
|
-
|
7684
|
-
|
7685
|
-
for (type in stacks) {
|
7686
|
-
for (i in stacks[type]) {
|
7687
|
-
stacks[type][i].total = null;
|
7688
|
-
stacks[type][i].cum = 0;
|
7689
|
-
}
|
7690
|
-
}
|
7710
|
+
if (axis.resetStacks) {
|
7711
|
+
axis.resetStacks();
|
7691
7712
|
}
|
7692
7713
|
|
7693
7714
|
axis.forceRedraw = false;
|
@@ -7706,17 +7727,8 @@ Axis.prototype = {
|
|
7706
7727
|
if (!axis.isDirty) {
|
7707
7728
|
axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;
|
7708
7729
|
}
|
7709
|
-
} else if (
|
7710
|
-
|
7711
|
-
stacks = axis.stacks = axis.oldStacks;
|
7712
|
-
}
|
7713
|
-
|
7714
|
-
// reset stacks
|
7715
|
-
for (type in stacks) {
|
7716
|
-
for (i in stacks[type]) {
|
7717
|
-
stacks[type][i].cum = stacks[type][i].total;
|
7718
|
-
}
|
7719
|
-
}
|
7730
|
+
} else if (axis.cleanStacks) {
|
7731
|
+
axis.cleanStacks();
|
7720
7732
|
}
|
7721
7733
|
},
|
7722
7734
|
|
@@ -7753,10 +7765,6 @@ Axis.prototype = {
|
|
7753
7765
|
axis.userMax = newMax;
|
7754
7766
|
axis.eventArgs = eventArguments;
|
7755
7767
|
|
7756
|
-
// Mark for running afterSetExtremes
|
7757
|
-
axis.isDirtyExtremes = true;
|
7758
|
-
|
7759
|
-
// redraw
|
7760
7768
|
if (redraw) {
|
7761
7769
|
chart.redraw(animation);
|
7762
7770
|
}
|
@@ -7770,15 +7778,17 @@ Axis.prototype = {
|
|
7770
7778
|
zoom: function (newMin, newMax) {
|
7771
7779
|
var dataMin = this.dataMin,
|
7772
7780
|
dataMax = this.dataMax,
|
7773
|
-
options = this.options
|
7781
|
+
options = this.options,
|
7782
|
+
min = mathMin(dataMin, pick(options.min, dataMin)),
|
7783
|
+
max = mathMax(dataMax, pick(options.max, dataMax));
|
7774
7784
|
|
7775
7785
|
// Prevent pinch zooming out of range. Check for defined is for #1946. #1734.
|
7776
7786
|
if (!this.allowZoomOutside) {
|
7777
|
-
if (defined(dataMin) && newMin <=
|
7778
|
-
newMin =
|
7787
|
+
if (defined(dataMin) && newMin <= min) {
|
7788
|
+
newMin = min;
|
7779
7789
|
}
|
7780
|
-
if (defined(dataMax) && newMax >=
|
7781
|
-
newMax =
|
7790
|
+
if (defined(dataMax) && newMax >= max) {
|
7791
|
+
newMax = max;
|
7782
7792
|
}
|
7783
7793
|
}
|
7784
7794
|
|
@@ -7943,7 +7953,7 @@ Axis.prototype = {
|
|
7943
7953
|
});
|
7944
7954
|
}
|
7945
7955
|
|
7946
|
-
} else {
|
7956
|
+
} else if (!labelOptions.step) { // #4411
|
7947
7957
|
newTickInterval = getStep(labelMetrics.h);
|
7948
7958
|
}
|
7949
7959
|
|
@@ -7977,7 +7987,7 @@ Axis.prototype = {
|
|
7977
7987
|
|
7978
7988
|
// Set rotation option unless it is "auto", like in gauges
|
7979
7989
|
if (!isString(labelOptions.rotation)) {
|
7980
|
-
attr.rotation = labelOptions.rotation;
|
7990
|
+
attr.rotation = labelOptions.rotation || 0; // #4443
|
7981
7991
|
}
|
7982
7992
|
|
7983
7993
|
// Handle auto rotation on horizontal axis
|
@@ -8199,10 +8209,7 @@ Axis.prototype = {
|
|
8199
8209
|
);
|
8200
8210
|
|
8201
8211
|
// Decide the clipping needed to keep the graph inside the plot area and axis lines
|
8202
|
-
clip = mathFloor(options.lineWidth / 2) * 2;
|
8203
|
-
if (options.offset) {
|
8204
|
-
clip = mathMax(0, clip - options.offset);
|
8205
|
-
}
|
8212
|
+
clip = options.offset ? 0 : mathFloor(options.lineWidth / 2) * 2; // #4308, #4371
|
8206
8213
|
clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], clip);
|
8207
8214
|
},
|
8208
8215
|
|
@@ -8303,6 +8310,7 @@ Axis.prototype = {
|
|
8303
8310
|
hasRendered = chart.hasRendered,
|
8304
8311
|
slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
|
8305
8312
|
showAxis = axis.showAxis,
|
8313
|
+
globalAnimation = renderer.globalAnimation,
|
8306
8314
|
from,
|
8307
8315
|
to;
|
8308
8316
|
|
@@ -9114,15 +9122,15 @@ Tooltip.prototype = {
|
|
9114
9122
|
ret = {},
|
9115
9123
|
h = point.h || 0, // #4117
|
9116
9124
|
swapped,
|
9117
|
-
first = ['y', chart.chartHeight, boxHeight, point.plotY + chart.plotTop],
|
9118
|
-
second = ['x', chart.chartWidth, boxWidth, point.plotX + chart.plotLeft],
|
9125
|
+
first = ['y', chart.chartHeight, boxHeight, point.plotY + chart.plotTop, chart.plotTop, chart.plotTop + chart.plotHeight],
|
9126
|
+
second = ['x', chart.chartWidth, boxWidth, point.plotX + chart.plotLeft, chart.plotLeft, chart.plotLeft + chart.plotWidth],
|
9119
9127
|
// The far side is right or bottom
|
9120
9128
|
preferFarSide = pick(point.ttBelow, (chart.inverted && !point.negative) || (!chart.inverted && point.negative)),
|
9121
9129
|
/**
|
9122
9130
|
* Handle the preferred dimension. When the preferred dimension is tooltip
|
9123
9131
|
* on top or bottom of the point, it will look for space there.
|
9124
9132
|
*/
|
9125
|
-
firstDimension = function (dim, outerSize, innerSize, point) {
|
9133
|
+
firstDimension = function (dim, outerSize, innerSize, point, min, max) {
|
9126
9134
|
var roomLeft = innerSize < point - distance,
|
9127
9135
|
roomRight = point + distance + innerSize < outerSize,
|
9128
9136
|
alignedLeft = point - distance - innerSize,
|
@@ -9133,9 +9141,9 @@ Tooltip.prototype = {
|
|
9133
9141
|
} else if (!preferFarSide && roomLeft) {
|
9134
9142
|
ret[dim] = alignedLeft;
|
9135
9143
|
} else if (roomLeft) {
|
9136
|
-
ret[dim] = alignedLeft - h < 0 ? alignedLeft : alignedLeft - h;
|
9144
|
+
ret[dim] = mathMin(max - innerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);
|
9137
9145
|
} else if (roomRight) {
|
9138
|
-
ret[dim] = alignedRight + h + innerSize > outerSize ? alignedRight : alignedRight + h;
|
9146
|
+
ret[dim] = mathMax(min, alignedRight + h + innerSize > outerSize ? alignedRight : alignedRight + h);
|
9139
9147
|
} else {
|
9140
9148
|
return false;
|
9141
9149
|
}
|
@@ -9631,19 +9639,17 @@ Pointer.prototype = {
|
|
9631
9639
|
tooltip.refresh(kdpoints, e);
|
9632
9640
|
}
|
9633
9641
|
|
9634
|
-
//
|
9642
|
+
// Do mouseover on all points (#3919, #3985, #4410)
|
9635
9643
|
each(kdpoints, function (point) {
|
9636
|
-
|
9637
|
-
|
9638
|
-
}
|
9639
|
-
});
|
9640
|
-
// #3919, #3985 do mouseover on the closest point last to ensure it is the hoverpoint
|
9641
|
-
((hoverSeries && hoverSeries.directTouch && hoverPoint) || kdpoint).onMouseOver(e);
|
9644
|
+
point.onMouseOver(e, point !== ((hoverSeries && hoverSeries.directTouch && hoverPoint) || kdpoint));
|
9645
|
+
});
|
9642
9646
|
} else {
|
9643
9647
|
if (tooltip) {
|
9644
9648
|
tooltip.refresh(kdpoint, e);
|
9645
9649
|
}
|
9646
|
-
|
9650
|
+
if(!hoverSeries || !hoverSeries.directTouch) { // #4448
|
9651
|
+
kdpoint.onMouseOver(e);
|
9652
|
+
}
|
9647
9653
|
}
|
9648
9654
|
this.prevKDPoint = kdpoint;
|
9649
9655
|
|
@@ -9805,10 +9811,17 @@ Pointer.prototype = {
|
|
9805
9811
|
plotHeight = chart.plotHeight,
|
9806
9812
|
clickedInside,
|
9807
9813
|
size,
|
9814
|
+
selectionMarker = this.selectionMarker,
|
9808
9815
|
mouseDownX = this.mouseDownX,
|
9809
9816
|
mouseDownY = this.mouseDownY,
|
9810
9817
|
panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];
|
9811
9818
|
|
9819
|
+
// If the device supports both touch and mouse (like IE11), and we are touch-dragging
|
9820
|
+
// inside the plot area, don't handle the mouse event. #4339.
|
9821
|
+
if (selectionMarker && selectionMarker.touch) {
|
9822
|
+
return;
|
9823
|
+
}
|
9824
|
+
|
9812
9825
|
// If the mouse is outside the plot area, adjust to cooordinates
|
9813
9826
|
// inside to prevent the selection marker from going outside
|
9814
9827
|
if (chartX < plotLeft) {
|
@@ -9834,8 +9847,8 @@ Pointer.prototype = {
|
|
9834
9847
|
|
9835
9848
|
// make a selection
|
9836
9849
|
if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {
|
9837
|
-
if (!
|
9838
|
-
this.selectionMarker = chart.renderer.rect(
|
9850
|
+
if (!selectionMarker) {
|
9851
|
+
this.selectionMarker = selectionMarker = chart.renderer.rect(
|
9839
9852
|
plotLeft,
|
9840
9853
|
plotTop,
|
9841
9854
|
zoomHor ? 1 : plotWidth,
|
@@ -9851,24 +9864,24 @@ Pointer.prototype = {
|
|
9851
9864
|
}
|
9852
9865
|
|
9853
9866
|
// adjust the width of the selection marker
|
9854
|
-
if (
|
9867
|
+
if (selectionMarker && zoomHor) {
|
9855
9868
|
size = chartX - mouseDownX;
|
9856
|
-
|
9869
|
+
selectionMarker.attr({
|
9857
9870
|
width: mathAbs(size),
|
9858
9871
|
x: (size > 0 ? 0 : size) + mouseDownX
|
9859
9872
|
});
|
9860
9873
|
}
|
9861
9874
|
// adjust the height of the selection marker
|
9862
|
-
if (
|
9875
|
+
if (selectionMarker && zoomVert) {
|
9863
9876
|
size = chartY - mouseDownY;
|
9864
|
-
|
9877
|
+
selectionMarker.attr({
|
9865
9878
|
height: mathAbs(size),
|
9866
9879
|
y: (size > 0 ? 0 : size) + mouseDownY
|
9867
9880
|
});
|
9868
9881
|
}
|
9869
9882
|
|
9870
9883
|
// panning
|
9871
|
-
if (clickedInside && !
|
9884
|
+
if (clickedInside && !selectionMarker && chartOptions.panning) {
|
9872
9885
|
chart.pan(e, chartOptions.panning);
|
9873
9886
|
}
|
9874
9887
|
}
|
@@ -10294,7 +10307,8 @@ extend(Highcharts.Pointer.prototype, {
|
|
10294
10307
|
// Set the marker
|
10295
10308
|
if (!selectionMarker) {
|
10296
10309
|
self.selectionMarker = selectionMarker = extend({
|
10297
|
-
destroy: noop
|
10310
|
+
destroy: noop,
|
10311
|
+
touch: true
|
10298
10312
|
}, chart.plotBox);
|
10299
10313
|
}
|
10300
10314
|
|
@@ -10829,7 +10843,7 @@ Legend.prototype = {
|
|
10829
10843
|
var chart = this.chart,
|
10830
10844
|
options = this.options,
|
10831
10845
|
// Use the first letter of each alignment option in order to detect the side
|
10832
|
-
alignment = options.align
|
10846
|
+
alignment = options.align.charAt(0) + options.verticalAlign.charAt(0) + options.layout.charAt(0); // #4189 - use charAt(x) notation instead of [x] for IE7
|
10833
10847
|
|
10834
10848
|
if (this.display && !options.floating) {
|
10835
10849
|
|
@@ -11517,16 +11531,16 @@ Chart.prototype = {
|
|
11517
11531
|
|
11518
11532
|
// redraw axes
|
11519
11533
|
each(axes, function (axis) {
|
11520
|
-
|
11534
|
+
|
11521
11535
|
// Fire 'afterSetExtremes' only if extremes are set
|
11522
|
-
|
11523
|
-
|
11536
|
+
var key = axis.min + ',' + axis.max;
|
11537
|
+
if (axis.extKey !== key) { // #821, #4452
|
11538
|
+
axis.extKey = key;
|
11524
11539
|
afterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)
|
11525
11540
|
fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751
|
11526
11541
|
delete axis.eventArgs;
|
11527
11542
|
});
|
11528
11543
|
}
|
11529
|
-
|
11530
11544
|
if (isDirtyBox || hasStackedSeries) {
|
11531
11545
|
axis.redraw();
|
11532
11546
|
}
|
@@ -11659,26 +11673,6 @@ Chart.prototype = {
|
|
11659
11673
|
});
|
11660
11674
|
},
|
11661
11675
|
|
11662
|
-
/**
|
11663
|
-
* Generate stacks for each series and calculate stacks total values
|
11664
|
-
*/
|
11665
|
-
getStacks: function () {
|
11666
|
-
var chart = this;
|
11667
|
-
|
11668
|
-
// reset stacks for each yAxis
|
11669
|
-
each(chart.yAxis, function (axis) {
|
11670
|
-
if (axis.stacks && axis.hasVisibleSeries) {
|
11671
|
-
axis.oldStacks = axis.stacks;
|
11672
|
-
}
|
11673
|
-
});
|
11674
|
-
|
11675
|
-
each(chart.series, function (series) {
|
11676
|
-
if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
|
11677
|
-
series.stackKey = series.type + pick(series.options.stack, '');
|
11678
|
-
}
|
11679
|
-
});
|
11680
|
-
},
|
11681
|
-
|
11682
11676
|
/**
|
11683
11677
|
* Show the title and subtitle of the chart
|
11684
11678
|
*
|
@@ -12047,7 +12041,9 @@ Chart.prototype = {
|
|
12047
12041
|
var chart = this,
|
12048
12042
|
chartWidth,
|
12049
12043
|
chartHeight,
|
12050
|
-
fireEndResize
|
12044
|
+
fireEndResize,
|
12045
|
+
renderer = chart.renderer,
|
12046
|
+
globalAnimation = renderer.globalAnimation;
|
12051
12047
|
|
12052
12048
|
// Handle the isResizing counter
|
12053
12049
|
chart.isResizing += 1;
|
@@ -12079,7 +12075,7 @@ Chart.prototype = {
|
|
12079
12075
|
}, globalAnimation);
|
12080
12076
|
|
12081
12077
|
chart.setChartSize(true);
|
12082
|
-
|
12078
|
+
renderer.setSize(chartWidth, chartHeight, animation);
|
12083
12079
|
|
12084
12080
|
// handle axes
|
12085
12081
|
chart.maxTicks = null;
|
@@ -12366,6 +12362,7 @@ Chart.prototype = {
|
|
12366
12362
|
if (linkedTo) {
|
12367
12363
|
linkedTo.linkedSeries.push(series);
|
12368
12364
|
series.linkedParent = linkedTo;
|
12365
|
+
series.visible = pick(series.options.visible, linkedTo.options.visible, series.visible); // #3879
|
12369
12366
|
}
|
12370
12367
|
}
|
12371
12368
|
});
|
@@ -12430,7 +12427,10 @@ Chart.prototype = {
|
|
12430
12427
|
// Legend
|
12431
12428
|
chart.legend = new Legend(chart, options.legend);
|
12432
12429
|
|
12433
|
-
|
12430
|
+
// Get stacks
|
12431
|
+
if (chart.getStacks) {
|
12432
|
+
chart.getStacks();
|
12433
|
+
}
|
12434
12434
|
|
12435
12435
|
// Get chart margins
|
12436
12436
|
chart.getMargins(true);
|
@@ -12895,15 +12895,15 @@ Point.prototype = {
|
|
12895
12895
|
* Return the configuration hash needed for the data label and tooltip formatters
|
12896
12896
|
*/
|
12897
12897
|
getLabelConfig: function () {
|
12898
|
-
var point = this;
|
12899
12898
|
return {
|
12900
|
-
x:
|
12901
|
-
y:
|
12902
|
-
|
12903
|
-
|
12904
|
-
|
12905
|
-
|
12906
|
-
|
12899
|
+
x: this.category,
|
12900
|
+
y: this.y,
|
12901
|
+
color: this.color,
|
12902
|
+
key: this.name || this.category,
|
12903
|
+
series: this.series,
|
12904
|
+
point: this,
|
12905
|
+
percentage: this.percentage,
|
12906
|
+
total: this.total || this.stackTotal
|
12907
12907
|
};
|
12908
12908
|
},
|
12909
12909
|
|
@@ -13296,7 +13296,9 @@ Series.prototype = {
|
|
13296
13296
|
* Get the series' color
|
13297
13297
|
*/
|
13298
13298
|
getColor: function () {
|
13299
|
-
if (
|
13299
|
+
if (this.options.colorByPoint) {
|
13300
|
+
this.options.color = null; // #4359, selected slice got series.color even when colorByPoint was set.
|
13301
|
+
} else {
|
13300
13302
|
this.getCyclic('color', this.options.color || defaultPlotOptions[this.type].color, this.chart.options.colors);
|
13301
13303
|
}
|
13302
13304
|
},
|
@@ -13412,7 +13414,7 @@ Series.prototype = {
|
|
13412
13414
|
pt = { series: series };
|
13413
13415
|
series.pointClass.prototype.applyOptions.apply(pt, [data[i]]);
|
13414
13416
|
series.updateParallelArrays(pt, i);
|
13415
|
-
if (hasCategories && pt.name) {
|
13417
|
+
if (hasCategories && defined(pt.name)) { // #4401
|
13416
13418
|
xAxis.names[pt.x] = pt.name; // #2046
|
13417
13419
|
}
|
13418
13420
|
}
|
@@ -14028,6 +14030,8 @@ Series.prototype = {
|
|
14028
14030
|
},
|
14029
14031
|
points = series.points || [], // #927
|
14030
14032
|
i,
|
14033
|
+
j,
|
14034
|
+
threshold,
|
14031
14035
|
point,
|
14032
14036
|
seriesPointAttr = [],
|
14033
14037
|
pointAttr,
|
@@ -14087,13 +14091,15 @@ Series.prototype = {
|
|
14087
14091
|
}
|
14088
14092
|
|
14089
14093
|
if (zones.length) {
|
14090
|
-
|
14091
|
-
|
14094
|
+
j = 0;
|
14095
|
+
threshold = zones[j];
|
14092
14096
|
while (point[zoneAxis] >= threshold.value) {
|
14093
14097
|
threshold = zones[++j];
|
14094
14098
|
}
|
14095
14099
|
|
14096
|
-
|
14100
|
+
if (threshold.color) {
|
14101
|
+
point.color = point.fillColor = threshold.color;
|
14102
|
+
}
|
14097
14103
|
}
|
14098
14104
|
|
14099
14105
|
hasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868
|
@@ -14349,7 +14355,6 @@ Series.prototype = {
|
|
14349
14355
|
attribs;
|
14350
14356
|
|
14351
14357
|
if (graph) {
|
14352
|
-
stop(graph); // cancel running animations, #459
|
14353
14358
|
graph.animate({ d: graphPath });
|
14354
14359
|
|
14355
14360
|
} else if ((lineWidth || fillColor) && graphPath.length) { // #1487
|
@@ -14388,8 +14393,7 @@ Series.prototype = {
|
|
14388
14393
|
graph = this.graph,
|
14389
14394
|
area = this.area,
|
14390
14395
|
chartSizeMax = mathMax(chart.chartWidth, chart.chartHeight),
|
14391
|
-
|
14392
|
-
axis = this[zoneAxis + 'Axis'],
|
14396
|
+
axis = this[(this.zoneAxis || 'y') + 'Axis'],
|
14393
14397
|
extremes,
|
14394
14398
|
reversed = axis.reversed,
|
14395
14399
|
inverted = chart.inverted,
|
@@ -14399,7 +14403,7 @@ Series.prototype = {
|
|
14399
14403
|
pxPosMax,
|
14400
14404
|
ignoreZones = false;
|
14401
14405
|
|
14402
|
-
if (zones.length && (graph || area)) {
|
14406
|
+
if (zones.length && (graph || area) && axis.min !== UNDEFINED) {
|
14403
14407
|
// The use of the Color Threshold assumes there are no gaps
|
14404
14408
|
// so it is safe to hide the original graph and area
|
14405
14409
|
if (graph) {
|
@@ -14762,7 +14766,7 @@ Series.prototype = {
|
|
14762
14766
|
|
14763
14767
|
// Start the recursive build process with a clone of the points array and null points filtered out (#3873)
|
14764
14768
|
function startRecursive() {
|
14765
|
-
var points = grep(series.points, function (point) {
|
14769
|
+
var points = grep(series.points || [], function (point) { // #4390
|
14766
14770
|
return point.y !== null;
|
14767
14771
|
});
|
14768
14772
|
|
@@ -14944,6 +14948,26 @@ StackItem.prototype = {
|
|
14944
14948
|
}
|
14945
14949
|
};
|
14946
14950
|
|
14951
|
+
/**
|
14952
|
+
* Generate stacks for each series and calculate stacks total values
|
14953
|
+
*/
|
14954
|
+
Chart.prototype.getStacks = function () {
|
14955
|
+
var chart = this;
|
14956
|
+
|
14957
|
+
// reset stacks for each yAxis
|
14958
|
+
each(chart.yAxis, function (axis) {
|
14959
|
+
if (axis.stacks && axis.hasVisibleSeries) {
|
14960
|
+
axis.oldStacks = axis.stacks;
|
14961
|
+
}
|
14962
|
+
});
|
14963
|
+
|
14964
|
+
each(chart.series, function (series) {
|
14965
|
+
if (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {
|
14966
|
+
series.stackKey = series.type + pick(series.options.stack, '');
|
14967
|
+
}
|
14968
|
+
});
|
14969
|
+
};
|
14970
|
+
|
14947
14971
|
|
14948
14972
|
// Stacking methods defined on the Axis prototype
|
14949
14973
|
|
@@ -15002,6 +15026,49 @@ Axis.prototype.renderStackTotals = function () {
|
|
15002
15026
|
}
|
15003
15027
|
};
|
15004
15028
|
|
15029
|
+
/**
|
15030
|
+
* Set all the stacks to initial states and destroy unused ones.
|
15031
|
+
*/
|
15032
|
+
Axis.prototype.resetStacks = function () {
|
15033
|
+
var stacks = this.stacks,
|
15034
|
+
type,
|
15035
|
+
i;
|
15036
|
+
if (!this.isXAxis) {
|
15037
|
+
for (type in stacks) {
|
15038
|
+
for (i in stacks[type]) {
|
15039
|
+
|
15040
|
+
// Clean up memory after point deletion (#1044, #4320)
|
15041
|
+
if (stacks[type][i].touched < this.stacksTouched) {
|
15042
|
+
stacks[type][i].destroy();
|
15043
|
+
delete stacks[type][i];
|
15044
|
+
|
15045
|
+
// Reset stacks
|
15046
|
+
} else {
|
15047
|
+
stacks[type][i].total = null;
|
15048
|
+
stacks[type][i].cum = 0;
|
15049
|
+
}
|
15050
|
+
}
|
15051
|
+
}
|
15052
|
+
}
|
15053
|
+
};
|
15054
|
+
|
15055
|
+
Axis.prototype.cleanStacks = function () {
|
15056
|
+
var stacks, type, i;
|
15057
|
+
|
15058
|
+
if (!this.isXAxis) {
|
15059
|
+
if (this.oldStacks) {
|
15060
|
+
stacks = this.stacks = this.oldStacks;
|
15061
|
+
}
|
15062
|
+
|
15063
|
+
// reset stacks
|
15064
|
+
for (type in stacks) {
|
15065
|
+
for (i in stacks[type]) {
|
15066
|
+
stacks[type][i].cum = stacks[type][i].total;
|
15067
|
+
}
|
15068
|
+
}
|
15069
|
+
}
|
15070
|
+
};
|
15071
|
+
|
15005
15072
|
|
15006
15073
|
// Stacking methods defnied for Series prototype
|
15007
15074
|
|
@@ -15038,6 +15105,9 @@ Series.prototype.setStackedPoints = function () {
|
|
15038
15105
|
x,
|
15039
15106
|
y;
|
15040
15107
|
|
15108
|
+
|
15109
|
+
yAxis.stacksTouched += 1;
|
15110
|
+
|
15041
15111
|
// loop over the non-null y values and read them into a local array
|
15042
15112
|
for (i = 0; i < yDataLength; i++) {
|
15043
15113
|
x = xData[i];
|
@@ -15068,7 +15138,7 @@ Series.prototype.setStackedPoints = function () {
|
|
15068
15138
|
stack = stacks[key][x];
|
15069
15139
|
//stack.points[pointKey] = [stack.cum || stackThreshold];
|
15070
15140
|
stack.points[pointKey] = [pick(stack.cum, stackThreshold)];
|
15071
|
-
|
15141
|
+
stack.touched = yAxis.stacksTouched;
|
15072
15142
|
|
15073
15143
|
|
15074
15144
|
// Add value to the stack total
|
@@ -15306,11 +15376,9 @@ extend(Point.prototype, {
|
|
15306
15376
|
if (isObject(options) && !isArray(options)) {
|
15307
15377
|
// Defer the actual redraw until getAttribs has been called (#3260)
|
15308
15378
|
point.redraw = function () {
|
15309
|
-
if (graphic) {
|
15379
|
+
if (graphic && graphic.element) {
|
15310
15380
|
if (options && options.marker && options.marker.symbol) {
|
15311
15381
|
point.graphic = graphic.destroy();
|
15312
|
-
} else {
|
15313
|
-
graphic.attr(point.pointAttr[point.state || ''])[point.visible === false ? 'hide' : 'show'](); // #2430
|
15314
15382
|
}
|
15315
15383
|
}
|
15316
15384
|
if (options && options.dataLabels && point.dataLabel) { // #2468
|
@@ -16157,10 +16225,11 @@ var ColumnSeries = extendClass(Series, {
|
|
16157
16225
|
groupPadding = categoryWidth * options.groupPadding,
|
16158
16226
|
groupWidth = categoryWidth - 2 * groupPadding,
|
16159
16227
|
pointOffsetWidth = groupWidth / columnCount,
|
16160
|
-
|
16161
|
-
|
16162
|
-
pointOffsetWidth * options.pointPadding
|
16163
|
-
|
16228
|
+
pointWidth = mathMin(
|
16229
|
+
options.maxPointWidth || xAxis.len,
|
16230
|
+
pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))
|
16231
|
+
),
|
16232
|
+
pointPadding = (pointOffsetWidth - pointWidth) / 2,
|
16164
16233
|
colIndex = (reversedXAxis ?
|
16165
16234
|
columnCount - (series.columnIndex || 0) : // #1251
|
16166
16235
|
series.columnIndex) || 0,
|
@@ -16415,7 +16484,7 @@ defaultPlotOptions.scatter = merge(defaultSeriesOptions, {
|
|
16415
16484
|
enabled: true // Overrides auto-enabling in line series (#3647)
|
16416
16485
|
},
|
16417
16486
|
tooltip: {
|
16418
|
-
headerFormat: '<span style="color:{
|
16487
|
+
headerFormat: '<span style="color:{point.color}">\u25CF</span> <span style="font-size: 10px;"> {series.name}</span><br/>',
|
16419
16488
|
pointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>'
|
16420
16489
|
}
|
16421
16490
|
});
|
@@ -16457,7 +16526,7 @@ defaultPlotOptions.pie = merge(defaultSeriesOptions, {
|
|
16457
16526
|
distance: 30,
|
16458
16527
|
enabled: true,
|
16459
16528
|
formatter: function () { // #2945
|
16460
|
-
return this.point.name;
|
16529
|
+
return this.y === null ? undefined : this.point.name;
|
16461
16530
|
},
|
16462
16531
|
// softConnector: true,
|
16463
16532
|
x: 0
|
@@ -16621,11 +16690,6 @@ var PieSeries = {
|
|
16621
16690
|
fill: 'color'
|
16622
16691
|
},
|
16623
16692
|
|
16624
|
-
/**
|
16625
|
-
* Pies have one color each point
|
16626
|
-
*/
|
16627
|
-
getColor: noop,
|
16628
|
-
|
16629
16693
|
/**
|
16630
16694
|
* Animate the pies in
|
16631
16695
|
*/
|
@@ -16844,47 +16908,48 @@ var PieSeries = {
|
|
16844
16908
|
|
16845
16909
|
// draw the slices
|
16846
16910
|
each(series.points, function (point) {
|
16847
|
-
|
16848
|
-
|
16849
|
-
|
16850
|
-
|
16851
|
-
// put the shadow behind all points
|
16852
|
-
if (shadow && !shadowGroup) {
|
16853
|
-
shadowGroup = point.shadowGroup = renderer.g('shadow')
|
16854
|
-
.add(series.shadowGroup);
|
16855
|
-
}
|
16911
|
+
if (point.y !== null) {
|
16912
|
+
graphic = point.graphic;
|
16913
|
+
shapeArgs = point.shapeArgs;
|
16914
|
+
shadowGroup = point.shadowGroup;
|
16856
16915
|
|
16857
|
-
|
16858
|
-
|
16859
|
-
|
16860
|
-
|
16861
|
-
|
16916
|
+
// put the shadow behind all points
|
16917
|
+
if (shadow && !shadowGroup) {
|
16918
|
+
shadowGroup = point.shadowGroup = renderer.g('shadow')
|
16919
|
+
.add(series.shadowGroup);
|
16920
|
+
}
|
16862
16921
|
|
16863
|
-
|
16864
|
-
|
16865
|
-
|
16866
|
-
|
16922
|
+
// if the point is sliced, use special translation, else use plot area traslation
|
16923
|
+
groupTranslation = point.sliced ? point.slicedTranslation : {
|
16924
|
+
translateX: 0,
|
16925
|
+
translateY: 0
|
16926
|
+
};
|
16867
16927
|
|
16868
|
-
|
16869
|
-
|
16870
|
-
|
16871
|
-
} else {
|
16872
|
-
attr = { 'stroke-linejoin': 'round' };
|
16873
|
-
if (!point.visible) {
|
16874
|
-
attr.visibility = 'hidden';
|
16928
|
+
//group.translate(groupTranslation[0], groupTranslation[1]);
|
16929
|
+
if (shadowGroup) {
|
16930
|
+
shadowGroup.attr(groupTranslation);
|
16875
16931
|
}
|
16876
16932
|
|
16877
|
-
|
16878
|
-
|
16879
|
-
.
|
16880
|
-
|
16881
|
-
|
16882
|
-
.
|
16883
|
-
|
16884
|
-
|
16885
|
-
.shadow(shadow, shadowGroup);
|
16886
|
-
}
|
16933
|
+
// draw the slice
|
16934
|
+
if (graphic) {
|
16935
|
+
graphic.animate(extend(shapeArgs, groupTranslation));
|
16936
|
+
} else {
|
16937
|
+
attr = { 'stroke-linejoin': 'round' };
|
16938
|
+
if (!point.visible) {
|
16939
|
+
attr.visibility = 'hidden';
|
16940
|
+
}
|
16887
16941
|
|
16942
|
+
point.graphic = graphic = renderer[point.shapeType](shapeArgs)
|
16943
|
+
.setRadialReference(series.center)
|
16944
|
+
.attr(
|
16945
|
+
point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]
|
16946
|
+
)
|
16947
|
+
.attr(attr)
|
16948
|
+
.attr(groupTranslation)
|
16949
|
+
.add(series.group)
|
16950
|
+
.shadow(shadow, shadowGroup);
|
16951
|
+
}
|
16952
|
+
}
|
16888
16953
|
});
|
16889
16954
|
|
16890
16955
|
},
|
@@ -17680,7 +17745,7 @@ if (seriesTypes.column) {
|
|
17680
17745
|
|
17681
17746
|
|
17682
17747
|
/**
|
17683
|
-
* Highcharts JS v4.1.
|
17748
|
+
* Highcharts JS v4.1.8 (2015-08-20)
|
17684
17749
|
* Highcharts module to hide overlapping data labels. This module is included by default in Highmaps.
|
17685
17750
|
*
|
17686
17751
|
* (c) 2010-2014 Torstein Honsi
|
@@ -17702,13 +17767,16 @@ if (seriesTypes.column) {
|
|
17702
17767
|
var labels = [];
|
17703
17768
|
|
17704
17769
|
each(chart.series, function (series) {
|
17705
|
-
var dlOptions = series.options.dataLabels
|
17770
|
+
var dlOptions = series.options.dataLabels,
|
17771
|
+
collections = series.dataLabelCollections || ['dataLabel']; // Range series have two collections
|
17706
17772
|
if ((dlOptions.enabled || series._hasPointLabels) && !dlOptions.allowOverlap && series.visible) { // #3866
|
17707
|
-
each(
|
17708
|
-
|
17709
|
-
|
17710
|
-
|
17711
|
-
|
17773
|
+
each(collections, function (coll) {
|
17774
|
+
each(series.points, function (point) {
|
17775
|
+
if (point[coll]) {
|
17776
|
+
point[coll].labelrank = pick(point.labelrank, point.shapeArgs && point.shapeArgs.height); // #4118
|
17777
|
+
labels.push(point[coll]);
|
17778
|
+
}
|
17779
|
+
});
|
17712
17780
|
});
|
17713
17781
|
}
|
17714
17782
|
});
|
@@ -17735,12 +17803,16 @@ if (seriesTypes.column) {
|
|
17735
17803
|
j,
|
17736
17804
|
label1,
|
17737
17805
|
label2,
|
17738
|
-
|
17806
|
+
isIntersecting,
|
17807
|
+
pos1,
|
17808
|
+
pos2,
|
17809
|
+
padding,
|
17810
|
+
intersectRect = function (x1, y1, w1, h1, x2, y2, w2, h2) {
|
17739
17811
|
return !(
|
17740
|
-
|
17741
|
-
|
17742
|
-
|
17743
|
-
|
17812
|
+
x2 > x1 + w1 ||
|
17813
|
+
x2 + w2 < x1 ||
|
17814
|
+
y2 > y1 + h1 ||
|
17815
|
+
y2 + h2 < y1
|
17744
17816
|
);
|
17745
17817
|
};
|
17746
17818
|
|
@@ -17757,7 +17829,7 @@ if (seriesTypes.column) {
|
|
17757
17829
|
// will hide the previous one because the previous one always has
|
17758
17830
|
// lower rank.
|
17759
17831
|
labels.sort(function (a, b) {
|
17760
|
-
return b.labelrank - a.labelrank;
|
17832
|
+
return (b.labelrank || 0) - (a.labelrank || 0);
|
17761
17833
|
});
|
17762
17834
|
|
17763
17835
|
// Detect overlapping labels
|
@@ -17766,24 +17838,55 @@ if (seriesTypes.column) {
|
|
17766
17838
|
|
17767
17839
|
for (j = i + 1; j < len; ++j) {
|
17768
17840
|
label2 = labels[j];
|
17769
|
-
if (label1 && label2 && label1.placed && label2.placed && label1.newOpacity !== 0 && label2.newOpacity !== 0
|
17770
|
-
|
17771
|
-
|
17841
|
+
if (label1 && label2 && label1.placed && label2.placed && label1.newOpacity !== 0 && label2.newOpacity !== 0) {
|
17842
|
+
pos1 = label1.alignAttr;
|
17843
|
+
pos2 = label2.alignAttr;
|
17844
|
+
padding = 2 * (label1.box ? 0 : label1.padding); // Substract the padding if no background or border (#4333)
|
17845
|
+
isIntersecting = intersectRect(
|
17846
|
+
pos1.x,
|
17847
|
+
pos1.y,
|
17848
|
+
label1.width - padding,
|
17849
|
+
label1.height - padding,
|
17850
|
+
pos2.x,
|
17851
|
+
pos2.y,
|
17852
|
+
label2.width - padding,
|
17853
|
+
label2.height - padding
|
17854
|
+
);
|
17855
|
+
|
17856
|
+
if (isIntersecting) {
|
17857
|
+
(label1.labelrank < label2.labelrank ? label1 : label2).newOpacity = 0;
|
17858
|
+
}
|
17772
17859
|
}
|
17773
17860
|
}
|
17774
17861
|
}
|
17775
17862
|
|
17776
17863
|
// Hide or show
|
17777
|
-
|
17778
|
-
|
17864
|
+
each(labels, function (label) {
|
17865
|
+
var complete,
|
17866
|
+
newOpacity;
|
17867
|
+
|
17779
17868
|
if (label) {
|
17780
|
-
|
17781
|
-
|
17782
|
-
|
17869
|
+
newOpacity = label.newOpacity;
|
17870
|
+
|
17871
|
+
if (label.oldOpacity !== newOpacity && label.placed) {
|
17872
|
+
|
17873
|
+
// Make sure the label is completely hidden to avoid catching clicks (#4362)
|
17874
|
+
if (newOpacity) {
|
17875
|
+
label.show(true);
|
17876
|
+
} else {
|
17877
|
+
complete = function () {
|
17878
|
+
label.hide();
|
17879
|
+
};
|
17880
|
+
}
|
17881
|
+
|
17882
|
+
// Animate or set the opacity
|
17883
|
+
label.alignAttr.opacity = newOpacity;
|
17884
|
+
label[label.isOld ? 'animate' : 'attr'](label.alignAttr, null, complete);
|
17885
|
+
|
17783
17886
|
}
|
17784
17887
|
label.isOld = true;
|
17785
17888
|
}
|
17786
|
-
}
|
17889
|
+
});
|
17787
17890
|
};
|
17788
17891
|
|
17789
17892
|
}(Highcharts));/**
|
@@ -18187,8 +18290,12 @@ extend(Point.prototype, {
|
|
18187
18290
|
|
18188
18291
|
/**
|
18189
18292
|
* Runs on mouse over the point
|
18293
|
+
*
|
18294
|
+
* @param {Object} e The event arguments
|
18295
|
+
* @param {Boolean} byProximity Falsy for kd points that are closest to the mouse, or to
|
18296
|
+
* actually hovered points. True for other points in shared tooltip.
|
18190
18297
|
*/
|
18191
|
-
onMouseOver: function (e) {
|
18298
|
+
onMouseOver: function (e, byProximity) {
|
18192
18299
|
var point = this,
|
18193
18300
|
series = point.series,
|
18194
18301
|
chart = series.chart,
|
@@ -18216,7 +18323,9 @@ extend(Point.prototype, {
|
|
18216
18323
|
|
18217
18324
|
// hover this
|
18218
18325
|
point.setState(HOVER_STATE);
|
18219
|
-
|
18326
|
+
if (!byProximity) {
|
18327
|
+
chart.hoverPoint = point;
|
18328
|
+
}
|
18220
18329
|
}
|
18221
18330
|
},
|
18222
18331
|
|