highcharts-rails 5.0.7 → 5.0.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 +41 -0
- data/README.markdown +3 -6
- data/app/assets/javascripts/highcharts.js +758 -455
- data/app/assets/javascripts/highcharts/highcharts-3d.js +58 -50
- data/app/assets/javascripts/highcharts/highcharts-more.js +21 -35
- data/app/assets/javascripts/highcharts/modules/accessibility.js +69 -39
- data/app/assets/javascripts/highcharts/modules/annotations.js +2 -2
- data/app/assets/javascripts/highcharts/modules/boost.js +2316 -337
- data/app/assets/javascripts/highcharts/modules/broken-axis.js +17 -3
- data/app/assets/javascripts/highcharts/modules/data.js +2 -2
- data/app/assets/javascripts/highcharts/modules/drilldown.js +6 -6
- data/app/assets/javascripts/highcharts/modules/exporting.js +4 -4
- data/app/assets/javascripts/highcharts/modules/funnel.js +4 -4
- data/app/assets/javascripts/highcharts/modules/grid-axis.js +6 -6
- data/app/assets/javascripts/highcharts/modules/heatmap.js +10 -7
- data/app/assets/javascripts/highcharts/modules/no-data-to-display.js +2 -2
- data/app/assets/javascripts/highcharts/modules/offline-exporting.js +3 -3
- data/app/assets/javascripts/highcharts/modules/overlapping-datalabels.js +3 -3
- data/app/assets/javascripts/highcharts/modules/series-label.js +2 -2
- data/app/assets/javascripts/highcharts/modules/solid-gauge.js +40 -4
- data/app/assets/javascripts/highcharts/modules/stock.js +100 -81
- data/app/assets/javascripts/highcharts/modules/treemap.js +36 -9
- data/app/assets/javascripts/highcharts/modules/xrange-series.js +2 -2
- data/lib/highcharts/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c07fdfe881d82631125b0d41f3308e896b0b0c39
|
4
|
+
data.tar.gz: 4763f46c66ebd67f143b07553efa26b16dba9926
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 62691100992c685c381e7fc5eaf9c0c884bb1008d7aad489e4b48d5119eb72a94ef24571ada79f01b3c94c6710ac5c0b8c012f374f4e6ece510890fe0117a36d
|
7
|
+
data.tar.gz: 196d2a3665e69acb6db35981518c9694a48a761a0d97d9cd8a1bccd684f5eb8aecf84b87da1b658fca9ed4c5d1563d08e076e5b243fc4a3b96e067ca15f7cd4a
|
data/CHANGELOG.markdown
CHANGED
@@ -1,3 +1,44 @@
|
|
1
|
+
# 5.0.8 / 2017-11-10
|
2
|
+
|
3
|
+
* Updated Highcharts to 5.0.8 (2017-03-08)
|
4
|
+
* Added a refactored Boost module based on WebGL. Details and API to be announced.
|
5
|
+
* Added animation on graph mouse over and mouse out.
|
6
|
+
* Added hooks so that users can define their own log axis conversion functions, and can advertise that the log axis should allow negative values.
|
7
|
+
* Added new option, solidgauge.rounded.
|
8
|
+
* Added support for relative chart.height as a percentage of the width. This allows for fixed aspect ratio.
|
9
|
+
* Bug fixes
|
10
|
+
* Fixed #223, pie chart data labels overflowed after pie reached minimum size.
|
11
|
+
* Fixed #2322, updating series type caused remnants of the original series type after multiple updates.
|
12
|
+
* Fixed #4916, data values were lost in export after updating a point from a numeric or array configuration to an object configuration.
|
13
|
+
* Fixed #5915, returning false from tooltip formatter only hid the tooltip when it was present from before.
|
14
|
+
* Fixed #6087, minPointLength shifted next points rendering.
|
15
|
+
* Fixed #6173, another case of unwanted inline CSS in style mode.
|
16
|
+
* Fixed #6187, navigator jumped back after dragging on touch devices.
|
17
|
+
* Fixed #6254, Point.update did not apply new class names.
|
18
|
+
* Fixed #6264, enabling individual bubble markers did not work.
|
19
|
+
* Fixed #6272, inverted stack area chart was badly drawn when containing nulls.
|
20
|
+
* Fixed #6274, allowDecimals: false was ignored with flat data.
|
21
|
+
* Fixed #6278, missing ticks before DST crossover in some cases.
|
22
|
+
* Fixed #6282, text-align did not take effect on data labels with useHTML.
|
23
|
+
* Fixed #6291, multiple responsive rules were applied an unapplied in wrong order when resizing.
|
24
|
+
* Fixed #6301, legend width option caused wrong alignment when aligned right.
|
25
|
+
* Fixed #6305, accessible keyboard navigation in polar charts not working correctly.
|
26
|
+
* Fixed #6314, treemap series failed with error in styled mode.
|
27
|
+
* Fixed #6321, bubbles were hidden when close and marker.enabled set to null.
|
28
|
+
* Fixed #6322, legend navigation arrows did not update correctly on responsiveness.
|
29
|
+
* Fixed #6328, issue with disabled tooltip in accessibility module.
|
30
|
+
* Fixed #6330, minor ticks affecting the computed extremes of Y axes in some cases.
|
31
|
+
* Fixed #6330, minor ticks were not applied outside major ticks on a logarithmic axis.
|
32
|
+
* Fixed #6347, error on applying responsive rules where series or axis length was greater than the existing chart.
|
33
|
+
* Fixed #6356, legend.maxHeight not respected after chart update.
|
34
|
+
* Fixed #6361, accessibility failing for IE8 and older.
|
35
|
+
* Fixed #6370, category axis with breaks was rendered incorrectly.
|
36
|
+
* Fixed #6384, Point.update didn't work with slice: false.
|
37
|
+
* Fixed #6387, graph and area rendered differently on area splines next to null points.
|
38
|
+
* Fixed #6399, treemap legend item had incorrect color after point was hidden.
|
39
|
+
* Fixed #6401, point.states didn't work for maps.
|
40
|
+
* Fixed #6402, treemap ignoreHiddenPoint is now true by default.
|
41
|
+
|
1
42
|
# 5.0.7 / 2017-01-25
|
2
43
|
|
3
44
|
* Updated Highcharts to 5.0.7 (2017-01-17)
|
data/README.markdown
CHANGED
@@ -26,14 +26,9 @@ In your JavaScript manifest (e.g. `application.js`)
|
|
26
26
|
// to get the new features in 2.3.0:
|
27
27
|
//= require highcharts/highcharts-more
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
//= require highcharts/adapters/standalone-framework
|
32
|
-
|
33
|
-
Or the modules
|
29
|
+
Including the modules you want and need
|
34
30
|
|
35
31
|
//= require highcharts/modules/annotations
|
36
|
-
//= require highcharts/modules/canvas-tools
|
37
32
|
//= require highcharts/modules/data
|
38
33
|
//= require highcharts/modules/drilldown
|
39
34
|
//= require highcharts/modules/exporting
|
@@ -50,6 +45,8 @@ Or one of the themes
|
|
50
45
|
//= require highcharts/themes/grid
|
51
46
|
//= require highcharts/themes/skies
|
52
47
|
|
48
|
+
Some of the modules are meant to be loaded by Highcharts on-demand, such as `canvas-tools` (https://github.com/highcharts/highcharts/issues/2311#issuecomment-25685317), so don't require them on your own.
|
49
|
+
|
53
50
|
Other than that, refer to the [Highcharts documentation](http://www.highcharts.com/docs)
|
54
51
|
|
55
52
|
## Licensing
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license Highcharts JS v5.0.
|
2
|
+
* @license Highcharts JS v5.0.8 (2017-03-08)
|
3
3
|
*
|
4
4
|
* (c) 2009-2016 Torstein Honsi
|
5
5
|
*
|
@@ -21,7 +21,6 @@
|
|
21
21
|
*
|
22
22
|
* License: www.highcharts.com/license
|
23
23
|
*/
|
24
|
-
'use strict';
|
25
24
|
/* global window */
|
26
25
|
var win = window,
|
27
26
|
doc = win.document;
|
@@ -36,7 +35,7 @@
|
|
36
35
|
|
37
36
|
var Highcharts = win.Highcharts ? win.Highcharts.error(16, true) : {
|
38
37
|
product: 'Highcharts',
|
39
|
-
version: '5.0.
|
38
|
+
version: '5.0.8',
|
40
39
|
deg2rad: Math.PI * 2 / 360,
|
41
40
|
doc: doc,
|
42
41
|
hasBidiBug: hasBidiBug,
|
@@ -67,7 +66,6 @@
|
|
67
66
|
* License: www.highcharts.com/license
|
68
67
|
*/
|
69
68
|
/* eslint max-len: ["warn", 80, 4] */
|
70
|
-
'use strict';
|
71
69
|
|
72
70
|
/**
|
73
71
|
* The Highcharts object is the placeholder for all other members, and various
|
@@ -1597,9 +1595,10 @@
|
|
1597
1595
|
* @function #each
|
1598
1596
|
* @memberOf Highcharts
|
1599
1597
|
* @param {Array} arr - The array to iterate over.
|
1600
|
-
* @param {Function} fn - The iterator callback. It passes
|
1598
|
+
* @param {Function} fn - The iterator callback. It passes three arguments:
|
1601
1599
|
* * item - The array item.
|
1602
1600
|
* * index - The item's index in the array.
|
1601
|
+
* * arr - The array that each is being applied to.
|
1603
1602
|
* @param {Object} [ctx] The context.
|
1604
1603
|
*/
|
1605
1604
|
H.each = function(arr, fn, ctx) { // modern browsers
|
@@ -1890,7 +1889,7 @@
|
|
1890
1889
|
if (!end) {
|
1891
1890
|
end = params[prop];
|
1892
1891
|
}
|
1893
|
-
if (end.match && end.match('px')) {
|
1892
|
+
if (end && end.match && end.match('px')) {
|
1894
1893
|
end = end.replace(/px/g, ''); // #4351
|
1895
1894
|
}
|
1896
1895
|
fx.run(start, end, unit);
|
@@ -2096,7 +2095,6 @@
|
|
2096
2095
|
*
|
2097
2096
|
* License: www.highcharts.com/license
|
2098
2097
|
*/
|
2099
|
-
'use strict';
|
2100
2098
|
var each = H.each,
|
2101
2099
|
isNumber = H.isNumber,
|
2102
2100
|
map = H.map,
|
@@ -2133,12 +2131,6 @@
|
|
2133
2131
|
parse: function(result) {
|
2134
2132
|
return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];
|
2135
2133
|
}
|
2136
|
-
}, {
|
2137
|
-
// HEX color
|
2138
|
-
regex: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
|
2139
|
-
parse: function(result) {
|
2140
|
-
return [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];
|
2141
|
-
}
|
2142
2134
|
}, {
|
2143
2135
|
// RGB color
|
2144
2136
|
regex: /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/,
|
@@ -2162,7 +2154,8 @@
|
|
2162
2154
|
var result,
|
2163
2155
|
rgba,
|
2164
2156
|
i,
|
2165
|
-
parser
|
2157
|
+
parser,
|
2158
|
+
len;
|
2166
2159
|
|
2167
2160
|
this.input = input = this.names[input] || input;
|
2168
2161
|
|
@@ -2174,12 +2167,46 @@
|
|
2174
2167
|
|
2175
2168
|
// Solid colors
|
2176
2169
|
} else {
|
2177
|
-
|
2178
|
-
|
2179
|
-
|
2180
|
-
|
2181
|
-
|
2182
|
-
|
2170
|
+
|
2171
|
+
// Check if it's possible to do bitmasking instead of regex
|
2172
|
+
if (input && input[0] === '#') {
|
2173
|
+
|
2174
|
+
len = input.length;
|
2175
|
+
input = parseInt(input.substr(1), 16);
|
2176
|
+
|
2177
|
+
// Handle long-form, e.g. #AABBCC
|
2178
|
+
if (len === 7) {
|
2179
|
+
|
2180
|
+
rgba = [
|
2181
|
+
(input & 0xFF0000) >> 16,
|
2182
|
+
(input & 0xFF00) >> 8,
|
2183
|
+
(input & 0xFF),
|
2184
|
+
1
|
2185
|
+
];
|
2186
|
+
|
2187
|
+
// Handle short-form, e.g. #ABC
|
2188
|
+
// In short form, the value is assumed to be the same
|
2189
|
+
// for both nibbles for each component. e.g. #ABC = #AABBCC
|
2190
|
+
} else if (len === 4) {
|
2191
|
+
|
2192
|
+
rgba = [
|
2193
|
+
((input & 0xF00) >> 4) | (input & 0xF00) >> 8,
|
2194
|
+
((input & 0xF0) >> 4) | (input & 0xF0),
|
2195
|
+
((input & 0xF) << 4) | (input & 0xF),
|
2196
|
+
1
|
2197
|
+
];
|
2198
|
+
}
|
2199
|
+
}
|
2200
|
+
|
2201
|
+
// Otherwise, check regex parsers
|
2202
|
+
if (!rgba) {
|
2203
|
+
i = this.parsers.length;
|
2204
|
+
while (i-- && !rgba) {
|
2205
|
+
parser = this.parsers[i];
|
2206
|
+
result = parser.regex.exec(input);
|
2207
|
+
if (result) {
|
2208
|
+
rgba = parser.parse(result);
|
2209
|
+
}
|
2183
2210
|
}
|
2184
2211
|
}
|
2185
2212
|
}
|
@@ -2265,7 +2292,6 @@
|
|
2265
2292
|
*
|
2266
2293
|
* License: www.highcharts.com/license
|
2267
2294
|
*/
|
2268
|
-
'use strict';
|
2269
2295
|
var SVGElement,
|
2270
2296
|
SVGRenderer,
|
2271
2297
|
|
@@ -2336,8 +2362,8 @@
|
|
2336
2362
|
* @type {Array.<string>}
|
2337
2363
|
*/
|
2338
2364
|
textProps: ['direction', 'fontSize', 'fontWeight', 'fontFamily',
|
2339
|
-
'fontStyle', 'color', 'lineHeight', 'width', '
|
2340
|
-
'textOverflow', 'textOutline'
|
2365
|
+
'fontStyle', 'color', 'lineHeight', 'width', 'textAlign',
|
2366
|
+
'textDecoration', 'textOverflow', 'textOutline'
|
2341
2367
|
],
|
2342
2368
|
|
2343
2369
|
/**
|
@@ -2385,6 +2411,9 @@
|
|
2385
2411
|
animate(this, params, animOptions);
|
2386
2412
|
} else {
|
2387
2413
|
this.attr(params, null, complete);
|
2414
|
+
if (animOptions.step) {
|
2415
|
+
animOptions.step.call(this);
|
2416
|
+
}
|
2388
2417
|
}
|
2389
2418
|
return this;
|
2390
2419
|
},
|
@@ -2946,10 +2975,9 @@
|
|
2946
2975
|
* @returns {SVGElement} Return the SVG element for chaining.
|
2947
2976
|
*/
|
2948
2977
|
css: function(styles) {
|
2949
|
-
var
|
2950
|
-
oldStyles = elemWrapper.styles,
|
2978
|
+
var oldStyles = this.styles,
|
2951
2979
|
newStyles = {},
|
2952
|
-
elem =
|
2980
|
+
elem = this.element,
|
2953
2981
|
textWidth,
|
2954
2982
|
n,
|
2955
2983
|
serializedCss = '',
|
@@ -2976,9 +3004,6 @@
|
|
2976
3004
|
}
|
2977
3005
|
}
|
2978
3006
|
if (hasNew) {
|
2979
|
-
textWidth = elemWrapper.textWidth =
|
2980
|
-
(styles && styles.width && elem.nodeName.toLowerCase() === 'text' && pInt(styles.width)) ||
|
2981
|
-
elemWrapper.textWidth; // #3501
|
2982
3007
|
|
2983
3008
|
// Merge the new styles with the old ones
|
2984
3009
|
if (oldStyles) {
|
@@ -2988,16 +3013,25 @@
|
|
2988
3013
|
);
|
2989
3014
|
}
|
2990
3015
|
|
3016
|
+
// Get the text width from style
|
3017
|
+
textWidth = this.textWidth = (
|
3018
|
+
styles &&
|
3019
|
+
styles.width &&
|
3020
|
+
styles.width !== 'auto' &&
|
3021
|
+
elem.nodeName.toLowerCase() === 'text' &&
|
3022
|
+
pInt(styles.width)
|
3023
|
+
);
|
3024
|
+
|
2991
3025
|
// store object
|
2992
|
-
|
3026
|
+
this.styles = styles;
|
2993
3027
|
|
2994
|
-
if (textWidth && (!svg &&
|
3028
|
+
if (textWidth && (!svg && this.renderer.forExport)) {
|
2995
3029
|
delete styles.width;
|
2996
3030
|
}
|
2997
3031
|
|
2998
3032
|
// serialize and set style attribute
|
2999
3033
|
if (isMS && !svg) {
|
3000
|
-
css(
|
3034
|
+
css(this.element, styles);
|
3001
3035
|
} else {
|
3002
3036
|
hyphenate = function(a, b) {
|
3003
3037
|
return '-' + b.toLowerCase();
|
@@ -3015,20 +3049,22 @@
|
|
3015
3049
|
}
|
3016
3050
|
|
3017
3051
|
|
3018
|
-
if (
|
3019
|
-
|
3020
|
-
|
3021
|
-
|
3052
|
+
if (this.added) {
|
3053
|
+
|
3054
|
+
// Rebuild text after added. Cache mechanisms in the buildText
|
3055
|
+
// will prevent building if there are no significant changes.
|
3056
|
+
if (this.element.nodeName === 'text') {
|
3057
|
+
this.renderer.buildText(this);
|
3022
3058
|
}
|
3023
3059
|
|
3024
3060
|
// Apply text outline after added
|
3025
3061
|
if (styles && styles.textOutline) {
|
3026
|
-
|
3062
|
+
this.applyTextOutline(styles.textOutline);
|
3027
3063
|
}
|
3028
3064
|
}
|
3029
3065
|
}
|
3030
3066
|
|
3031
|
-
return
|
3067
|
+
return this;
|
3032
3068
|
},
|
3033
3069
|
|
3034
3070
|
|
@@ -3986,7 +4022,7 @@
|
|
3986
4022
|
'class': 'highcharts-root'
|
3987
4023
|
})
|
3988
4024
|
|
3989
|
-
|
4025
|
+
.css(this.getStyle(style));
|
3990
4026
|
element = boxWrapper.element;
|
3991
4027
|
container.appendChild(element);
|
3992
4028
|
|
@@ -4025,7 +4061,7 @@
|
|
4025
4061
|
|
4026
4062
|
// Add description
|
4027
4063
|
desc = this.createElement('desc').add();
|
4028
|
-
desc.element.appendChild(doc.createTextNode('Created with Highcharts 5.0.
|
4064
|
+
desc.element.appendChild(doc.createTextNode('Created with Highcharts 5.0.8'));
|
4029
4065
|
|
4030
4066
|
|
4031
4067
|
renderer.defs = this.createElement('defs').add();
|
@@ -4262,8 +4298,10 @@
|
|
4262
4298
|
|
4263
4299
|
if (hasMarkup) {
|
4264
4300
|
lines = textStr
|
4301
|
+
|
4265
4302
|
.replace(/<(b|strong)>/g, '<span style="font-weight:bold">')
|
4266
4303
|
.replace(/<(i|em)>/g, '<span style="font-style:italic">')
|
4304
|
+
|
4267
4305
|
.replace(/<a/g, '<span')
|
4268
4306
|
.replace(/<\/(b|strong|i|em|a)>/g, '</span>')
|
4269
4307
|
.split(/<br.*?>/g);
|
@@ -4723,24 +4761,28 @@
|
|
4723
4761
|
* @returns {SVGElement} The generated wrapper element.
|
4724
4762
|
*/
|
4725
4763
|
arc: function(x, y, r, innerR, start, end) {
|
4726
|
-
var arc
|
4764
|
+
var arc,
|
4765
|
+
options;
|
4727
4766
|
|
4728
4767
|
if (isObject(x)) {
|
4729
|
-
|
4730
|
-
|
4731
|
-
|
4732
|
-
|
4733
|
-
|
4734
|
-
|
4768
|
+
options = x;
|
4769
|
+
y = options.y;
|
4770
|
+
r = options.r;
|
4771
|
+
innerR = options.innerR;
|
4772
|
+
start = options.start;
|
4773
|
+
end = options.end;
|
4774
|
+
x = options.x;
|
4775
|
+
} else {
|
4776
|
+
options = {
|
4777
|
+
innerR: innerR,
|
4778
|
+
start: start,
|
4779
|
+
end: end
|
4780
|
+
};
|
4735
4781
|
}
|
4736
4782
|
|
4737
4783
|
// Arcs are defined as symbols for the ability to set
|
4738
4784
|
// attributes in attr and animate
|
4739
|
-
arc = this.symbol('arc', x
|
4740
|
-
innerR: innerR || 0,
|
4741
|
-
start: start || 0,
|
4742
|
-
end: end || 0
|
4743
|
-
});
|
4785
|
+
arc = this.symbol('arc', x, y, r, r, options);
|
4744
4786
|
arc.r = r; // #959
|
4745
4787
|
return arc;
|
4746
4788
|
},
|
@@ -5596,7 +5638,7 @@
|
|
5596
5638
|
|
5597
5639
|
// only change local variables
|
5598
5640
|
wrapper.widthSetter = function(value) {
|
5599
|
-
width = value;
|
5641
|
+
width = H.isNumber(value) ? value : null; // width:auto => null
|
5600
5642
|
};
|
5601
5643
|
wrapper.heightSetter = function(value) {
|
5602
5644
|
height = value;
|
@@ -5769,7 +5811,6 @@
|
|
5769
5811
|
*
|
5770
5812
|
* License: www.highcharts.com/license
|
5771
5813
|
*/
|
5772
|
-
'use strict';
|
5773
5814
|
var attr = H.attr,
|
5774
5815
|
createElement = H.createElement,
|
5775
5816
|
css = H.css,
|
@@ -6132,7 +6173,6 @@
|
|
6132
6173
|
*
|
6133
6174
|
* License: www.highcharts.com/license
|
6134
6175
|
*/
|
6135
|
-
'use strict';
|
6136
6176
|
|
6137
6177
|
var VMLRenderer,
|
6138
6178
|
VMLRendererExtension,
|
@@ -7284,7 +7324,6 @@
|
|
7284
7324
|
*
|
7285
7325
|
* License: www.highcharts.com/license
|
7286
7326
|
*/
|
7287
|
-
'use strict';
|
7288
7327
|
var color = H.color,
|
7289
7328
|
each = H.each,
|
7290
7329
|
getTZOffset = H.getTZOffset,
|
@@ -7327,7 +7366,7 @@
|
|
7327
7366
|
useUTC: true,
|
7328
7367
|
//timezoneOffset: 0,
|
7329
7368
|
|
7330
|
-
VMLRadialGradientURL: 'http://code.highcharts.com/5.0.
|
7369
|
+
VMLRadialGradientURL: 'http://code.highcharts.com/5.0.8/gfx/vml-radial-gradient.png'
|
7331
7370
|
|
7332
7371
|
},
|
7333
7372
|
chart: {
|
@@ -7377,8 +7416,8 @@
|
|
7377
7416
|
backgroundColor: '#ffffff',
|
7378
7417
|
//plotBackgroundColor: null,
|
7379
7418
|
plotBorderColor: '#cccccc'
|
7380
|
-
|
7381
|
-
|
7419
|
+
//plotBorderWidth: 0,
|
7420
|
+
//plotShadow: false
|
7382
7421
|
|
7383
7422
|
},
|
7384
7423
|
title: {
|
@@ -7673,7 +7712,6 @@
|
|
7673
7712
|
*
|
7674
7713
|
* License: www.highcharts.com/license
|
7675
7714
|
*/
|
7676
|
-
'use strict';
|
7677
7715
|
var arrayMax = H.arrayMax,
|
7678
7716
|
arrayMin = H.arrayMin,
|
7679
7717
|
defined = H.defined,
|
@@ -8000,7 +8038,6 @@
|
|
8000
8038
|
*
|
8001
8039
|
* License: www.highcharts.com/license
|
8002
8040
|
*/
|
8003
|
-
'use strict';
|
8004
8041
|
var correctFloat = H.correctFloat,
|
8005
8042
|
defined = H.defined,
|
8006
8043
|
destroyObjectProperties = H.destroyObjectProperties,
|
@@ -8084,10 +8121,10 @@
|
|
8084
8121
|
labelOptions.useHTML
|
8085
8122
|
)
|
8086
8123
|
|
8087
|
-
|
8088
|
-
|
8124
|
+
// without position absolute, IE export sometimes is wrong
|
8125
|
+
.css(merge(labelOptions.style))
|
8089
8126
|
|
8090
|
-
|
8127
|
+
.add(axis.labelGroup) :
|
8091
8128
|
null;
|
8092
8129
|
tick.labelLength = label && label.getBBox().width; // Un-rotated length
|
8093
8130
|
tick.rotation = 0; // Base value to detect change for new calls to getBBox
|
@@ -8261,51 +8298,31 @@
|
|
8261
8298
|
},
|
8262
8299
|
|
8263
8300
|
/**
|
8264
|
-
*
|
8265
|
-
*
|
8266
|
-
* @param
|
8267
|
-
* @param
|
8301
|
+
* Renders the gridLine.
|
8302
|
+
* @param {Boolean} old Whether or not the tick is old
|
8303
|
+
* @param {number} opacity The opacity of the grid line
|
8304
|
+
* @param {number} reverseCrisp Modifier for avoiding overlapping 1 or -1
|
8305
|
+
* @return {undefined}
|
8268
8306
|
*/
|
8269
|
-
|
8307
|
+
renderGridLine: function(old, opacity, reverseCrisp) {
|
8270
8308
|
var tick = this,
|
8271
8309
|
axis = tick.axis,
|
8272
8310
|
options = axis.options,
|
8273
|
-
chart = axis.chart,
|
8274
|
-
renderer = chart.renderer,
|
8275
|
-
horiz = axis.horiz,
|
8276
|
-
type = tick.type,
|
8277
|
-
label = tick.label,
|
8278
|
-
pos = tick.pos,
|
8279
|
-
labelOptions = options.labels,
|
8280
8311
|
gridLine = tick.gridLine,
|
8281
|
-
tickPrefix = type ? type + 'Tick' : 'tick',
|
8282
|
-
tickSize = axis.tickSize(tickPrefix),
|
8283
8312
|
gridLinePath,
|
8284
|
-
mark = tick.mark,
|
8285
|
-
isNewMark = !mark,
|
8286
|
-
step = labelOptions.step,
|
8287
8313
|
attribs = {},
|
8288
|
-
|
8314
|
+
pos = tick.pos,
|
8315
|
+
type = tick.type,
|
8289
8316
|
tickmarkOffset = axis.tickmarkOffset,
|
8290
|
-
|
8291
|
-
x = xy.x,
|
8292
|
-
y = xy.y,
|
8293
|
-
reverseCrisp = ((horiz && x === axis.pos + axis.len) ||
|
8294
|
-
(!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687
|
8317
|
+
renderer = axis.chart.renderer;
|
8295
8318
|
|
8296
8319
|
|
8297
8320
|
var gridPrefix = type ? type + 'Grid' : 'grid',
|
8298
8321
|
gridLineWidth = options[gridPrefix + 'LineWidth'],
|
8299
8322
|
gridLineColor = options[gridPrefix + 'LineColor'],
|
8300
|
-
dashStyle = options[gridPrefix + 'LineDashStyle']
|
8301
|
-
tickWidth = pick(options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0), // X axis defaults to 1
|
8302
|
-
tickColor = options[tickPrefix + 'Color'];
|
8303
|
-
|
8323
|
+
dashStyle = options[gridPrefix + 'LineDashStyle'];
|
8304
8324
|
|
8305
|
-
opacity = pick(opacity, 1);
|
8306
|
-
this.isActive = true;
|
8307
8325
|
|
8308
|
-
// Create the grid line
|
8309
8326
|
if (!gridLine) {
|
8310
8327
|
|
8311
8328
|
attribs.stroke = gridLineColor;
|
@@ -8322,14 +8339,20 @@
|
|
8322
8339
|
}
|
8323
8340
|
tick.gridLine = gridLine = renderer.path()
|
8324
8341
|
.attr(attribs)
|
8325
|
-
.addClass(
|
8342
|
+
.addClass(
|
8343
|
+
'highcharts-' + (type ? type + '-' : '') + 'grid-line'
|
8344
|
+
)
|
8326
8345
|
.add(axis.gridGroup);
|
8327
8346
|
}
|
8328
8347
|
|
8329
8348
|
// If the parameter 'old' is set, the current call will be followed
|
8330
8349
|
// by another call, therefore do not do any animations this time
|
8331
8350
|
if (!old && gridLine) {
|
8332
|
-
gridLinePath = axis.getPlotLinePath(
|
8351
|
+
gridLinePath = axis.getPlotLinePath(
|
8352
|
+
pos + tickmarkOffset,
|
8353
|
+
gridLine.strokeWidth() * reverseCrisp,
|
8354
|
+
old, true
|
8355
|
+
);
|
8333
8356
|
if (gridLinePath) {
|
8334
8357
|
gridLine[tick.isNew ? 'attr' : 'animate']({
|
8335
8358
|
d: gridLinePath,
|
@@ -8337,8 +8360,37 @@
|
|
8337
8360
|
});
|
8338
8361
|
}
|
8339
8362
|
}
|
8363
|
+
},
|
8364
|
+
|
8365
|
+
/**
|
8366
|
+
* Renders the tick mark.
|
8367
|
+
* @param {Object} xy The position vector of the mark
|
8368
|
+
* @param {number} xy.x The x position of the mark
|
8369
|
+
* @param {number} xy.y The y position of the mark
|
8370
|
+
* @param {number} opacity The opacity of the mark
|
8371
|
+
* @param {number} reverseCrisp Modifier for avoiding overlapping 1 or -1
|
8372
|
+
* @return {undefined}
|
8373
|
+
*/
|
8374
|
+
renderMark: function(xy, opacity, reverseCrisp) {
|
8375
|
+
var tick = this,
|
8376
|
+
axis = tick.axis,
|
8377
|
+
options = axis.options,
|
8378
|
+
renderer = axis.chart.renderer,
|
8379
|
+
type = tick.type,
|
8380
|
+
tickPrefix = type ? type + 'Tick' : 'tick',
|
8381
|
+
tickSize = axis.tickSize(tickPrefix),
|
8382
|
+
mark = tick.mark,
|
8383
|
+
isNewMark = !mark,
|
8384
|
+
x = xy.x,
|
8385
|
+
y = xy.y;
|
8386
|
+
|
8387
|
+
|
8388
|
+
var tickWidth = pick(
|
8389
|
+
options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0
|
8390
|
+
), // X axis defaults to 1
|
8391
|
+
tickColor = options[tickPrefix + 'Color'];
|
8392
|
+
|
8340
8393
|
|
8341
|
-
// create the tick mark
|
8342
8394
|
if (tickSize) {
|
8343
8395
|
|
8344
8396
|
// negate the length
|
@@ -8360,20 +8412,70 @@
|
|
8360
8412
|
|
8361
8413
|
}
|
8362
8414
|
mark[isNewMark ? 'attr' : 'animate']({
|
8363
|
-
d: tick.getMarkPath(
|
8415
|
+
d: tick.getMarkPath(
|
8416
|
+
x,
|
8417
|
+
y,
|
8418
|
+
tickSize[0],
|
8419
|
+
mark.strokeWidth() * reverseCrisp,
|
8420
|
+
axis.horiz,
|
8421
|
+
renderer),
|
8364
8422
|
opacity: opacity
|
8365
8423
|
});
|
8366
8424
|
|
8367
8425
|
}
|
8426
|
+
},
|
8368
8427
|
|
8369
|
-
|
8428
|
+
/**
|
8429
|
+
* Renders the tick label.
|
8430
|
+
* Note: The label should already be created in init(), so it should only
|
8431
|
+
* have to be moved into place.
|
8432
|
+
* @param {Object} xy The position vector of the label
|
8433
|
+
* @param {number} xy.x The x position of the label
|
8434
|
+
* @param {number} xy.y The y position of the label
|
8435
|
+
* @param {Boolean} old Whether or not the tick is old
|
8436
|
+
* @param {number} opacity The opacity of the label
|
8437
|
+
* @param {number} index The index of the tick
|
8438
|
+
* @return {undefined}
|
8439
|
+
*/
|
8440
|
+
renderLabel: function(xy, old, opacity, index) {
|
8441
|
+
var tick = this,
|
8442
|
+
axis = tick.axis,
|
8443
|
+
horiz = axis.horiz,
|
8444
|
+
options = axis.options,
|
8445
|
+
label = tick.label,
|
8446
|
+
labelOptions = options.labels,
|
8447
|
+
step = labelOptions.step,
|
8448
|
+
tickmarkOffset = axis.tickmarkOffset,
|
8449
|
+
show = true,
|
8450
|
+
x = xy.x,
|
8451
|
+
y = xy.y;
|
8370
8452
|
if (label && isNumber(x)) {
|
8371
|
-
label.xy = xy = tick.getLabelPosition(
|
8453
|
+
label.xy = xy = tick.getLabelPosition(
|
8454
|
+
x,
|
8455
|
+
y,
|
8456
|
+
label,
|
8457
|
+
horiz,
|
8458
|
+
labelOptions,
|
8459
|
+
tickmarkOffset,
|
8460
|
+
index,
|
8461
|
+
step
|
8462
|
+
);
|
8372
8463
|
|
8373
|
-
// Apply show first and show last. If the tick is both first and
|
8374
|
-
// a single centered tick, in which case we show the
|
8375
|
-
|
8376
|
-
|
8464
|
+
// Apply show first and show last. If the tick is both first and
|
8465
|
+
// last, it is a single centered tick, in which case we show the
|
8466
|
+
// label anyway (#2100).
|
8467
|
+
if (
|
8468
|
+
(
|
8469
|
+
tick.isFirst &&
|
8470
|
+
!tick.isLast &&
|
8471
|
+
!pick(options.showFirstLabel, 1)
|
8472
|
+
) ||
|
8473
|
+
(
|
8474
|
+
tick.isLast &&
|
8475
|
+
!tick.isFirst &&
|
8476
|
+
!pick(options.showLastLabel, 1)
|
8477
|
+
)
|
8478
|
+
) {
|
8377
8479
|
show = false;
|
8378
8480
|
|
8379
8481
|
// Handle label overflow and show or hide accordingly
|
@@ -8399,6 +8501,38 @@
|
|
8399
8501
|
}
|
8400
8502
|
},
|
8401
8503
|
|
8504
|
+
/**
|
8505
|
+
* Put everything in place
|
8506
|
+
*
|
8507
|
+
* @param index {Number}
|
8508
|
+
* @param old {Boolean} Use old coordinates to prepare an animation into new
|
8509
|
+
* position
|
8510
|
+
*/
|
8511
|
+
render: function(index, old, opacity) {
|
8512
|
+
var tick = this,
|
8513
|
+
axis = tick.axis,
|
8514
|
+
horiz = axis.horiz,
|
8515
|
+
pos = tick.pos,
|
8516
|
+
tickmarkOffset = axis.tickmarkOffset,
|
8517
|
+
xy = tick.getPosition(horiz, pos, tickmarkOffset, old),
|
8518
|
+
x = xy.x,
|
8519
|
+
y = xy.y,
|
8520
|
+
reverseCrisp = ((horiz && x === axis.pos + axis.len) ||
|
8521
|
+
(!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687
|
8522
|
+
|
8523
|
+
opacity = pick(opacity, 1);
|
8524
|
+
this.isActive = true;
|
8525
|
+
|
8526
|
+
// Create the grid line
|
8527
|
+
this.renderGridLine(old, opacity, reverseCrisp);
|
8528
|
+
|
8529
|
+
// create the tick mark
|
8530
|
+
this.renderMark(xy, opacity, reverseCrisp);
|
8531
|
+
|
8532
|
+
// the label is created on init - now move it into place
|
8533
|
+
this.renderLabel(xy, old, opacity, index);
|
8534
|
+
},
|
8535
|
+
|
8402
8536
|
/**
|
8403
8537
|
* Destructor for the tick prototype
|
8404
8538
|
*/
|
@@ -8414,7 +8548,6 @@
|
|
8414
8548
|
*
|
8415
8549
|
* License: www.highcharts.com/license
|
8416
8550
|
*/
|
8417
|
-
'use strict';
|
8418
8551
|
|
8419
8552
|
var addEvent = H.addEvent,
|
8420
8553
|
animObject = H.animObject,
|
@@ -8491,10 +8624,10 @@
|
|
8491
8624
|
},
|
8492
8625
|
|
8493
8626
|
x: 0
|
8494
|
-
|
8495
|
-
|
8496
|
-
|
8497
|
-
|
8627
|
+
//y: undefined
|
8628
|
+
/*formatter: function () {
|
8629
|
+
return this.value;
|
8630
|
+
},*/
|
8498
8631
|
},
|
8499
8632
|
//linkedTo: null,
|
8500
8633
|
//max: undefined,
|
@@ -8556,7 +8689,7 @@
|
|
8556
8689
|
// gridLineDashStyle: 'solid',
|
8557
8690
|
// gridLineWidth: 0,
|
8558
8691
|
tickColor: '#ccd6eb'
|
8559
|
-
|
8692
|
+
// tickWidth: 1
|
8560
8693
|
|
8561
8694
|
},
|
8562
8695
|
|
@@ -8600,7 +8733,7 @@
|
|
8600
8733
|
|
8601
8734
|
gridLineWidth: 1,
|
8602
8735
|
lineWidth: 0
|
8603
|
-
|
8736
|
+
// tickWidth: 0
|
8604
8737
|
|
8605
8738
|
},
|
8606
8739
|
|
@@ -8635,8 +8768,8 @@
|
|
8635
8768
|
labels: {
|
8636
8769
|
autoRotation: [-45],
|
8637
8770
|
x: 0
|
8638
|
-
|
8639
|
-
|
8771
|
+
// overflow: undefined,
|
8772
|
+
// staggerLines: null
|
8640
8773
|
},
|
8641
8774
|
title: {
|
8642
8775
|
rotation: 0
|
@@ -8649,8 +8782,8 @@
|
|
8649
8782
|
labels: {
|
8650
8783
|
autoRotation: [-45],
|
8651
8784
|
x: 0
|
8652
|
-
|
8653
|
-
|
8785
|
+
// overflow: undefined
|
8786
|
+
// staggerLines: null
|
8654
8787
|
},
|
8655
8788
|
title: {
|
8656
8789
|
rotation: 0
|
@@ -8714,6 +8847,7 @@
|
|
8714
8847
|
// Shorthand types
|
8715
8848
|
axis.isLog = type === 'logarithmic';
|
8716
8849
|
axis.isDatetimeAxis = isDatetimeAxis;
|
8850
|
+
axis.positiveValuesOnly = axis.isLog && !axis.allowNegativeLog;
|
8717
8851
|
|
8718
8852
|
// Flag, if axis is linked to another axis
|
8719
8853
|
axis.isLinked = defined(options.linkedTo);
|
@@ -8812,6 +8946,7 @@
|
|
8812
8946
|
}
|
8813
8947
|
|
8814
8948
|
// extend logarithmic axis
|
8949
|
+
axis.lin2log = options.linearToLogConverter || axis.lin2log;
|
8815
8950
|
if (axis.isLog) {
|
8816
8951
|
axis.val2lin = axis.log2lin;
|
8817
8952
|
axis.lin2val = axis.lin2log;
|
@@ -8851,7 +8986,7 @@
|
|
8851
8986
|
formatOption = axis.options.labels.format,
|
8852
8987
|
|
8853
8988
|
// make sure the same symbol is added for all labels on a linear axis
|
8854
|
-
numericSymbolDetector = axis.isLog ? value : axis.tickInterval;
|
8989
|
+
numericSymbolDetector = axis.isLog ? Math.abs(value) : axis.tickInterval;
|
8855
8990
|
|
8856
8991
|
if (formatOption) {
|
8857
8992
|
ret = format(formatOption, this);
|
@@ -8915,7 +9050,7 @@
|
|
8915
9050
|
axis.hasVisibleSeries = true;
|
8916
9051
|
|
8917
9052
|
// Validate threshold in logarithmic axes
|
8918
|
-
if (axis.
|
9053
|
+
if (axis.positiveValuesOnly && threshold <= 0) {
|
8919
9054
|
threshold = null;
|
8920
9055
|
}
|
8921
9056
|
|
@@ -8960,7 +9095,7 @@
|
|
8960
9095
|
axis.threshold = threshold;
|
8961
9096
|
}
|
8962
9097
|
// If any series has a hard threshold, it takes precedence
|
8963
|
-
if (!seriesOptions.softThreshold || axis.
|
9098
|
+
if (!seriesOptions.softThreshold || axis.positiveValuesOnly) {
|
8964
9099
|
axis.softThreshold = false;
|
8965
9100
|
}
|
8966
9101
|
}
|
@@ -9107,8 +9242,9 @@
|
|
9107
9242
|
roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval),
|
9108
9243
|
tickPositions = [];
|
9109
9244
|
|
9110
|
-
// For single points, add a tick regardless of the relative position
|
9111
|
-
|
9245
|
+
// For single points, add a tick regardless of the relative position
|
9246
|
+
// (#2662, #6274)
|
9247
|
+
if (this.single) {
|
9112
9248
|
return [min];
|
9113
9249
|
}
|
9114
9250
|
|
@@ -9145,23 +9281,31 @@
|
|
9145
9281
|
minorTickInterval = axis.minorTickInterval,
|
9146
9282
|
minorTickPositions = [],
|
9147
9283
|
pos,
|
9148
|
-
i,
|
9149
9284
|
pointRangePadding = axis.pointRangePadding || 0,
|
9150
9285
|
min = axis.min - pointRangePadding, // #1498
|
9151
9286
|
max = axis.max + pointRangePadding, // #1498
|
9152
|
-
range = max - min
|
9153
|
-
len;
|
9287
|
+
range = max - min;
|
9154
9288
|
|
9155
9289
|
// If minor ticks get too dense, they are hard to read, and may cause long running script. So we don't draw them.
|
9156
9290
|
if (range && range / minorTickInterval < axis.len / 3) { // #3875
|
9157
9291
|
|
9158
9292
|
if (axis.isLog) {
|
9159
|
-
|
9160
|
-
|
9161
|
-
|
9162
|
-
|
9163
|
-
|
9164
|
-
|
9293
|
+
// For each interval in the major ticks, compute the minor ticks
|
9294
|
+
// separately.
|
9295
|
+
each(this.paddedTicks, function(pos, i, paddedTicks) {
|
9296
|
+
if (i) {
|
9297
|
+
minorTickPositions.push.apply(
|
9298
|
+
minorTickPositions,
|
9299
|
+
axis.getLogTickPositions(
|
9300
|
+
minorTickInterval,
|
9301
|
+
paddedTicks[i - 1],
|
9302
|
+
paddedTicks[i],
|
9303
|
+
true
|
9304
|
+
)
|
9305
|
+
);
|
9306
|
+
}
|
9307
|
+
});
|
9308
|
+
|
9165
9309
|
} else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314
|
9166
9310
|
minorTickPositions = minorTickPositions.concat(
|
9167
9311
|
axis.getTimeTicks(
|
@@ -9184,8 +9328,8 @@
|
|
9184
9328
|
}
|
9185
9329
|
}
|
9186
9330
|
|
9187
|
-
if (minorTickPositions.length !== 0) {
|
9188
|
-
axis.trimTicks(minorTickPositions
|
9331
|
+
if (minorTickPositions.length !== 0) {
|
9332
|
+
axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330
|
9189
9333
|
}
|
9190
9334
|
return minorTickPositions;
|
9191
9335
|
},
|
@@ -9435,7 +9579,9 @@
|
|
9435
9579
|
if (saveOld) {
|
9436
9580
|
axis.oldTransA = transA;
|
9437
9581
|
}
|
9438
|
-
axis.translationSlope = axis.transA = transA =
|
9582
|
+
axis.translationSlope = axis.transA = transA =
|
9583
|
+
axis.options.staticScale ||
|
9584
|
+
axis.len / ((range + pointRangePadding) || 1);
|
9439
9585
|
axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend
|
9440
9586
|
axis.minPixelPadding = transA * minPointOffset;
|
9441
9587
|
},
|
@@ -9510,7 +9656,11 @@
|
|
9510
9656
|
}
|
9511
9657
|
|
9512
9658
|
if (isLog) {
|
9513
|
-
if (
|
9659
|
+
if (
|
9660
|
+
axis.positiveValuesOnly &&
|
9661
|
+
!secondPass &&
|
9662
|
+
Math.min(axis.min, pick(axis.dataMin, axis.min)) <= 0
|
9663
|
+
) { // #978
|
9514
9664
|
H.error(10, 1); // Can't plot negative values on log axis
|
9515
9665
|
}
|
9516
9666
|
// The correctFloat cures #934, float errors on full tens. But it
|
@@ -9659,8 +9809,7 @@
|
|
9659
9809
|
tickPositionsOption = options.tickPositions,
|
9660
9810
|
tickPositioner = options.tickPositioner,
|
9661
9811
|
startOnTick = options.startOnTick,
|
9662
|
-
endOnTick = options.endOnTick
|
9663
|
-
single;
|
9812
|
+
endOnTick = options.endOnTick;
|
9664
9813
|
|
9665
9814
|
// Set the tickmarkOffset
|
9666
9815
|
this.tickmarkOffset = (this.categories && options.tickmarkPlacement === 'between' &&
|
@@ -9671,6 +9820,13 @@
|
|
9671
9820
|
this.minorTickInterval = options.minorTickInterval === 'auto' && this.tickInterval ?
|
9672
9821
|
this.tickInterval / 5 : options.minorTickInterval;
|
9673
9822
|
|
9823
|
+
// When there is only one point, or all points have the same value on
|
9824
|
+
// this axis, then min and max are equal and tickPositions.length is 0
|
9825
|
+
// or 1. In this case, add some padding in order to center the point,
|
9826
|
+
// but leave it with one tick. #1337.
|
9827
|
+
this.single = this.min === this.max && defined(this.min) &&
|
9828
|
+
!this.tickAmount && options.allowDecimals !== false;
|
9829
|
+
|
9674
9830
|
// Find the tick positions
|
9675
9831
|
this.tickPositions = tickPositions = tickPositionsOption && tickPositionsOption.slice(); // Work on a copy (#1565)
|
9676
9832
|
if (!tickPositions) {
|
@@ -9708,19 +9864,16 @@
|
|
9708
9864
|
|
9709
9865
|
}
|
9710
9866
|
|
9711
|
-
//
|
9867
|
+
// Reset min/max or remove extremes based on start/end on tick
|
9868
|
+
this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor
|
9712
9869
|
this.trimTicks(tickPositions, startOnTick, endOnTick);
|
9713
9870
|
if (!this.isLinked) {
|
9714
|
-
|
9715
|
-
//
|
9716
|
-
|
9717
|
-
if (this.min === this.max && defined(this.min) && !this.tickAmount) {
|
9718
|
-
// Substract half a unit (#2619, #2846, #2515, #3390)
|
9719
|
-
single = true;
|
9871
|
+
|
9872
|
+
// Substract half a unit (#2619, #2846, #2515, #3390)
|
9873
|
+
if (this.single) {
|
9720
9874
|
this.min -= 0.5;
|
9721
9875
|
this.max += 0.5;
|
9722
9876
|
}
|
9723
|
-
this.single = single;
|
9724
9877
|
if (!tickPositionsOption && !tickPositioner) {
|
9725
9878
|
this.adjustTickAmount();
|
9726
9879
|
}
|
@@ -10392,9 +10545,9 @@
|
|
10392
10545
|
})
|
10393
10546
|
.addClass('highcharts-axis-title')
|
10394
10547
|
|
10395
|
-
|
10548
|
+
.css(axisTitleOptions.style)
|
10396
10549
|
|
10397
|
-
|
10550
|
+
.add(axis.axisGroup);
|
10398
10551
|
axis.axisTitle.isNew = true;
|
10399
10552
|
}
|
10400
10553
|
|
@@ -10557,7 +10710,9 @@
|
|
10557
10710
|
axisOffset[side],
|
10558
10711
|
axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,
|
10559
10712
|
labelOffsetPadded, // #3027
|
10560
|
-
hasData && tickPositions.length && tickSize ?
|
10713
|
+
hasData && tickPositions.length && tickSize ?
|
10714
|
+
tickSize[0] + directionFactor * axis.offset :
|
10715
|
+
0 // #4866
|
10561
10716
|
);
|
10562
10717
|
|
10563
10718
|
// Decide the clipping needed to keep the graph inside the plot area and axis lines
|
@@ -11052,7 +11207,6 @@
|
|
11052
11207
|
*
|
11053
11208
|
* License: www.highcharts.com/license
|
11054
11209
|
*/
|
11055
|
-
'use strict';
|
11056
11210
|
var Axis = H.Axis,
|
11057
11211
|
Date = H.Date,
|
11058
11212
|
dateFormat = H.dateFormat,
|
@@ -11082,7 +11236,7 @@
|
|
11082
11236
|
higherRanks = {},
|
11083
11237
|
useUTC = defaultOptions.global.useUTC,
|
11084
11238
|
minYear, // used in months and years as a basis for Date.UTC()
|
11085
|
-
minDate = new Date(min - getTZOffset(min)),
|
11239
|
+
minDate = new Date(min - Math.abs(getTZOffset(min))), // #6278
|
11086
11240
|
makeTime = Date.hcMakeTime,
|
11087
11241
|
interval = normalizedInterval.unitRange,
|
11088
11242
|
count = normalizedInterval.count,
|
@@ -11313,7 +11467,6 @@
|
|
11313
11467
|
*
|
11314
11468
|
* License: www.highcharts.com/license
|
11315
11469
|
*/
|
11316
|
-
'use strict';
|
11317
11470
|
var Axis = H.Axis,
|
11318
11471
|
getMagnitude = H.getMagnitude,
|
11319
11472
|
map = H.map,
|
@@ -11437,7 +11590,6 @@
|
|
11437
11590
|
*
|
11438
11591
|
* License: www.highcharts.com/license
|
11439
11592
|
*/
|
11440
|
-
'use strict';
|
11441
11593
|
var dateFormat = H.dateFormat,
|
11442
11594
|
each = H.each,
|
11443
11595
|
extend = H.extend,
|
@@ -11828,21 +11980,20 @@
|
|
11828
11980
|
|
11829
11981
|
/**
|
11830
11982
|
* Refresh the tooltip's text and position.
|
11831
|
-
* @param {Object} point
|
11983
|
+
* @param {Object|Array} pointOrPoints Rither a point or an array of points
|
11832
11984
|
*/
|
11833
|
-
refresh: function(
|
11985
|
+
refresh: function(pointOrPoints, mouseEvent) {
|
11834
11986
|
var tooltip = this,
|
11835
|
-
chart = tooltip.chart,
|
11836
11987
|
label,
|
11837
11988
|
options = tooltip.options,
|
11838
11989
|
x,
|
11839
11990
|
y,
|
11991
|
+
point = pointOrPoints,
|
11840
11992
|
anchor,
|
11841
11993
|
textConfig = {},
|
11842
11994
|
text,
|
11843
11995
|
pointConfig = [],
|
11844
11996
|
formatter = options.formatter || tooltip.defaultFormatter,
|
11845
|
-
hoverPoints = chart.hoverPoints,
|
11846
11997
|
shared = tooltip.shared,
|
11847
11998
|
currentSeries;
|
11848
11999
|
|
@@ -11856,16 +12007,6 @@
|
|
11856
12007
|
|
11857
12008
|
// shared tooltip, array is sent over
|
11858
12009
|
if (shared && !(point.series && point.series.noSharedTooltip)) {
|
11859
|
-
|
11860
|
-
// hide previous hoverPoints and set new
|
11861
|
-
|
11862
|
-
chart.hoverPoints = point;
|
11863
|
-
if (hoverPoints) {
|
11864
|
-
each(hoverPoints, function(point) {
|
11865
|
-
point.setState();
|
11866
|
-
});
|
11867
|
-
}
|
11868
|
-
|
11869
12010
|
each(point, function(item) {
|
11870
12011
|
item.setState('hover');
|
11871
12012
|
|
@@ -11906,7 +12047,7 @@
|
|
11906
12047
|
|
11907
12048
|
// update text
|
11908
12049
|
if (tooltip.split) {
|
11909
|
-
this.renderSplit(text,
|
12050
|
+
this.renderSplit(text, pointOrPoints);
|
11910
12051
|
} else {
|
11911
12052
|
label.attr({
|
11912
12053
|
text: text && text.join ? text.join('') : text
|
@@ -12201,7 +12342,6 @@
|
|
12201
12342
|
*
|
12202
12343
|
* License: www.highcharts.com/license
|
12203
12344
|
*/
|
12204
|
-
'use strict';
|
12205
12345
|
var addEvent = H.addEvent,
|
12206
12346
|
attr = H.attr,
|
12207
12347
|
charts = H.charts,
|
@@ -12338,91 +12478,57 @@
|
|
12338
12478
|
});
|
12339
12479
|
return coordinates;
|
12340
12480
|
},
|
12341
|
-
|
12342
12481
|
/**
|
12343
|
-
*
|
12344
|
-
*
|
12482
|
+
* Collects the points closest to a mouseEvent
|
12483
|
+
* @param {Array} series Array of series to gather points from
|
12484
|
+
* @param {Boolean} shared True if shared tooltip, otherwise false
|
12485
|
+
* @param {Object} e Mouse event which possess a position to compare against
|
12486
|
+
* @return {Array} KDPoints sorted by distance
|
12345
12487
|
*/
|
12346
|
-
|
12347
|
-
|
12348
|
-
var pointer = this,
|
12349
|
-
chart = pointer.chart,
|
12350
|
-
series = chart.series,
|
12351
|
-
tooltip = chart.tooltip,
|
12352
|
-
shared = tooltip ? tooltip.shared : false,
|
12353
|
-
followPointer,
|
12354
|
-
updatePosition = true,
|
12355
|
-
hoverPoint = chart.hoverPoint,
|
12356
|
-
hoverSeries = chart.hoverSeries,
|
12357
|
-
i,
|
12358
|
-
anchor,
|
12488
|
+
getKDPoints: function(series, shared, e) {
|
12489
|
+
var kdpoints = [],
|
12359
12490
|
noSharedTooltip,
|
12360
|
-
stickToHoverSeries,
|
12361
12491
|
directTouch,
|
12362
|
-
|
12363
|
-
|
12364
|
-
|
12365
|
-
// For hovering over the empty parts of the plot area (hoverSeries is undefined).
|
12366
|
-
// If there is one series with point tracking (combo chart), don't go to nearest neighbour.
|
12367
|
-
if (!shared && !hoverSeries) {
|
12368
|
-
for (i = 0; i < series.length; i++) {
|
12369
|
-
if (series[i].directTouch || !series[i].options.stickyTracking) {
|
12370
|
-
series = [];
|
12371
|
-
}
|
12372
|
-
}
|
12373
|
-
}
|
12374
|
-
|
12375
|
-
// If it has a hoverPoint and that series requires direct touch (like columns, #3899), or we're on
|
12376
|
-
// a noSharedTooltip series among shared tooltip series (#4546), use the hoverPoint . Otherwise,
|
12377
|
-
// search the k-d tree.
|
12378
|
-
stickToHoverSeries = hoverSeries && (shared ? hoverSeries.noSharedTooltip : hoverSeries.directTouch);
|
12379
|
-
if (stickToHoverSeries && hoverPoint) {
|
12380
|
-
kdpoints = [hoverPoint];
|
12492
|
+
kdpointT,
|
12493
|
+
i;
|
12381
12494
|
|
12382
|
-
|
12383
|
-
|
12384
|
-
//
|
12385
|
-
|
12386
|
-
|
12387
|
-
|
12388
|
-
|
12389
|
-
|
12390
|
-
|
12391
|
-
// Skip hidden series
|
12392
|
-
noSharedTooltip = s.noSharedTooltip && shared;
|
12393
|
-
directTouch = !shared && s.directTouch;
|
12394
|
-
if (s.visible && !noSharedTooltip && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821
|
12395
|
-
kdpointT = s.searchPoint(e, !noSharedTooltip && s.kdDimensions === 1); // #3828
|
12396
|
-
if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)
|
12397
|
-
kdpoints.push(kdpointT);
|
12398
|
-
}
|
12495
|
+
// Find nearest points on all series
|
12496
|
+
each(series, function(s) {
|
12497
|
+
// Skip hidden series
|
12498
|
+
noSharedTooltip = s.noSharedTooltip && shared;
|
12499
|
+
directTouch = !shared && s.directTouch;
|
12500
|
+
if (s.visible && !noSharedTooltip && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821
|
12501
|
+
kdpointT = s.searchPoint(e, !noSharedTooltip && s.kdDimensions === 1); // #3828
|
12502
|
+
if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)
|
12503
|
+
kdpoints.push(kdpointT);
|
12399
12504
|
}
|
12400
|
-
}
|
12401
|
-
|
12402
|
-
// Sort kdpoints by distance to mouse pointer
|
12403
|
-
kdpoints.sort(function(p1, p2) {
|
12404
|
-
var isCloserX = p1.distX - p2.distX,
|
12405
|
-
isCloser = p1.dist - p2.dist,
|
12406
|
-
isAbove = (p2.series.group && p2.series.group.zIndex) -
|
12407
|
-
(p1.series.group && p1.series.group.zIndex);
|
12505
|
+
}
|
12506
|
+
});
|
12408
12507
|
|
12409
|
-
|
12410
|
-
|
12411
|
-
|
12412
|
-
|
12508
|
+
// Sort kdpoints by distance to mouse pointer
|
12509
|
+
kdpoints.sort(function(p1, p2) {
|
12510
|
+
var isCloserX = p1.distX - p2.distX,
|
12511
|
+
isCloser = p1.dist - p2.dist,
|
12512
|
+
isAbove =
|
12513
|
+
(p2.series.group && p2.series.group.zIndex) -
|
12514
|
+
(p1.series.group && p1.series.group.zIndex),
|
12515
|
+
result;
|
12516
|
+
|
12517
|
+
// We have two points which are not in the same place on xAxis and shared tooltip:
|
12518
|
+
if (isCloserX !== 0 && shared) { // #5721
|
12519
|
+
result = isCloserX;
|
12413
12520
|
// Points are not exactly in the same place on x/yAxis:
|
12414
|
-
|
12415
|
-
|
12416
|
-
}
|
12521
|
+
} else if (isCloser !== 0) {
|
12522
|
+
result = isCloser;
|
12417
12523
|
// The same xAxis and yAxis position, sort by z-index:
|
12418
|
-
|
12419
|
-
|
12420
|
-
}
|
12421
|
-
|
12524
|
+
} else if (isAbove !== 0) {
|
12525
|
+
result = isAbove;
|
12422
12526
|
// The same zIndex, sort by array index:
|
12423
|
-
|
12424
|
-
|
12425
|
-
|
12527
|
+
} else {
|
12528
|
+
result = p1.series.index > p2.series.index ? -1 : 1;
|
12529
|
+
}
|
12530
|
+
return result;
|
12531
|
+
});
|
12426
12532
|
|
12427
12533
|
// Remove points with different x-positions, required for shared tooltip and crosshairs (#4645):
|
12428
12534
|
if (shared) {
|
@@ -12433,57 +12539,173 @@
|
|
12433
12539
|
}
|
12434
12540
|
}
|
12435
12541
|
}
|
12542
|
+
return kdpoints;
|
12543
|
+
},
|
12544
|
+
getPointFromEvent: function(e) {
|
12545
|
+
var target = e.target,
|
12546
|
+
point;
|
12547
|
+
|
12548
|
+
while (target && !point) {
|
12549
|
+
point = target.point;
|
12550
|
+
target = target.parentNode;
|
12551
|
+
}
|
12552
|
+
return point;
|
12553
|
+
},
|
12436
12554
|
|
12437
|
-
|
12438
|
-
|
12439
|
-
|
12440
|
-
|
12441
|
-
|
12442
|
-
for (i = 0; i < kdpoints.length; i++) {
|
12443
|
-
kdpoints[i].onMouseOver(e, kdpoints[i] !== ((hoverSeries && hoverSeries.directTouch && hoverPoint) || kdpoints[0]));
|
12444
|
-
}
|
12555
|
+
getHoverData: function(existingHoverPoint, existingHoverSeries, series, isDirectTouch, shared, e) {
|
12556
|
+
var i,
|
12557
|
+
hoverPoint = existingHoverPoint,
|
12558
|
+
hoverSeries = existingHoverSeries,
|
12559
|
+
hoverPoints;
|
12445
12560
|
|
12446
|
-
|
12447
|
-
|
12448
|
-
|
12449
|
-
|
12450
|
-
|
12561
|
+
// If it has a hoverPoint and that series requires direct touch (like columns, #3899), or we're on
|
12562
|
+
// a noSharedTooltip series among shared tooltip series (#4546), use the hoverPoint . Otherwise,
|
12563
|
+
// search the k-d tree.
|
12564
|
+
// Handle shared tooltip or cases where a series is not yet hovered
|
12565
|
+
if (isDirectTouch) {
|
12566
|
+
if (shared) {
|
12567
|
+
hoverPoints = [];
|
12568
|
+
each(series, function(s) {
|
12569
|
+
// Skip hidden series
|
12570
|
+
var noSharedTooltip = s.noSharedTooltip && shared,
|
12571
|
+
directTouch = !shared && s.directTouch,
|
12572
|
+
kdpointT;
|
12573
|
+
if (s.visible && !noSharedTooltip && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821
|
12574
|
+
kdpointT = s.searchKDTree({
|
12575
|
+
clientX: hoverPoint.clientX,
|
12576
|
+
plotY: hoverPoint.plotY
|
12577
|
+
}, !noSharedTooltip && s.kdDimensions === 1);
|
12578
|
+
if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)
|
12579
|
+
hoverPoints.push(kdpointT);
|
12580
|
+
}
|
12581
|
+
}
|
12582
|
+
});
|
12583
|
+
// If kdTree is not built
|
12584
|
+
if (hoverPoints.length === 0) {
|
12585
|
+
hoverPoints = [hoverPoint];
|
12451
12586
|
}
|
12452
12587
|
} else {
|
12453
|
-
|
12454
|
-
|
12455
|
-
|
12456
|
-
|
12457
|
-
|
12588
|
+
hoverPoints = [hoverPoint];
|
12589
|
+
}
|
12590
|
+
} else if (hoverSeries && !hoverSeries.options.stickyTracking) {
|
12591
|
+
hoverPoints = this.getKDPoints([hoverSeries], shared, e);
|
12592
|
+
hoverPoint = hoverPoints[0];
|
12593
|
+
hoverSeries = hoverPoint && hoverPoint.series;
|
12594
|
+
} else {
|
12595
|
+
if (!shared) {
|
12596
|
+
// For hovering over the empty parts of the plot area (hoverSeries is undefined).
|
12597
|
+
// If there is one series with point tracking (combo chart), don't go to nearest neighbour.
|
12598
|
+
if (!hoverSeries) {
|
12599
|
+
for (i = 0; i < series.length; i++) {
|
12600
|
+
if (series[i].directTouch || !series[i].options.stickyTracking) {
|
12601
|
+
series = [];
|
12602
|
+
}
|
12603
|
+
}
|
12604
|
+
// When we have non-shared tooltip and sticky tracking is disabled,
|
12605
|
+
// search for the closest point only on hovered series: #5533, #5476
|
12606
|
+
} else if (!hoverSeries.options.stickyTracking) {
|
12607
|
+
series = [hoverSeries];
|
12458
12608
|
}
|
12459
12609
|
}
|
12460
|
-
this.
|
12461
|
-
|
12610
|
+
hoverPoints = this.getKDPoints(series, shared, e);
|
12611
|
+
hoverPoint = hoverPoints[0];
|
12612
|
+
hoverSeries = hoverPoint && hoverPoint.series;
|
12462
12613
|
}
|
12463
|
-
//
|
12464
|
-
|
12465
|
-
|
12466
|
-
|
12467
|
-
|
12468
|
-
|
12469
|
-
|
12470
|
-
|
12471
|
-
|
12614
|
+
// Keep the order of series in tooltip
|
12615
|
+
// Must be done after assigning of hoverPoint
|
12616
|
+
hoverPoints.sort(function(p1, p2) {
|
12617
|
+
return p1.series.index - p2.series.index;
|
12618
|
+
});
|
12619
|
+
|
12620
|
+
return {
|
12621
|
+
hoverPoint: hoverPoint,
|
12622
|
+
hoverSeries: hoverSeries,
|
12623
|
+
hoverPoints: hoverPoints
|
12624
|
+
};
|
12625
|
+
},
|
12626
|
+
/**
|
12627
|
+
* With line type charts with a single tracker, get the point closest to the mouse.
|
12628
|
+
* Run Point.onMouseOver and display tooltip for the point or points.
|
12629
|
+
*/
|
12630
|
+
runPointActions: function(e, p) {
|
12631
|
+
var pointer = this,
|
12632
|
+
chart = pointer.chart,
|
12633
|
+
series = chart.series,
|
12634
|
+
tooltip = chart.tooltip,
|
12635
|
+
shared = tooltip ? tooltip.shared : false,
|
12636
|
+
hoverPoint = p || chart.hoverPoint,
|
12637
|
+
hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries,
|
12638
|
+
// onMouseOver or already hovering a series with directTouch
|
12639
|
+
isDirectTouch = !!p || (hoverSeries && hoverSeries.directTouch),
|
12640
|
+
hoverData = this.getHoverData(hoverPoint, hoverSeries, series, isDirectTouch, shared, e),
|
12641
|
+
useSharedTooltip,
|
12642
|
+
followPointer,
|
12643
|
+
anchor,
|
12644
|
+
points;
|
12645
|
+
|
12646
|
+
// Update variables from hoverData.
|
12647
|
+
hoverPoint = hoverData.hoverPoint;
|
12648
|
+
hoverSeries = hoverData.hoverSeries;
|
12649
|
+
followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;
|
12650
|
+
useSharedTooltip = shared && hoverPoint && !hoverPoint.series.noSharedTooltip;
|
12651
|
+
points = useSharedTooltip ? hoverData.hoverPoints : [hoverPoint];
|
12652
|
+
|
12653
|
+
// Refresh tooltip for kdpoint if new hover point or tooltip was hidden // #3926, #4200
|
12654
|
+
if (
|
12655
|
+
hoverPoint &&
|
12656
|
+
// !(hoverSeries && hoverSeries.directTouch) &&
|
12657
|
+
(hoverPoint !== chart.hoverPoint || (tooltip && tooltip.isHidden))
|
12658
|
+
) {
|
12659
|
+
each(chart.hoverPoints || [], function(p) {
|
12660
|
+
if (H.inArray(p, points) === -1) {
|
12661
|
+
p.setState();
|
12662
|
+
}
|
12663
|
+
});
|
12664
|
+
// Do mouseover on all points (#3919, #3985, #4410, #5622)
|
12665
|
+
each(points || [], function(p) {
|
12666
|
+
p.setState('hover');
|
12667
|
+
});
|
12668
|
+
// set normal state to previous series
|
12669
|
+
if (chart.hoverSeries !== hoverSeries) {
|
12670
|
+
hoverSeries.onMouseOver();
|
12671
|
+
}
|
12672
|
+
|
12673
|
+
// If tracking is on series in stead of on each point,
|
12674
|
+
// fire mouseOver on hover point.
|
12675
|
+
if (hoverSeries && !hoverSeries.directTouch) { // #4448
|
12676
|
+
if (chart.hoverPoint) {
|
12677
|
+
chart.hoverPoint.firePointEvent('mouseOut');
|
12678
|
+
}
|
12679
|
+
hoverPoint.firePointEvent('mouseOver');
|
12472
12680
|
}
|
12681
|
+
chart.hoverPoints = points;
|
12682
|
+
chart.hoverPoint = hoverPoint;
|
12683
|
+
// Draw tooltip if necessary
|
12684
|
+
if (tooltip) {
|
12685
|
+
tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);
|
12686
|
+
}
|
12687
|
+
// Update positions (regardless of kdpoint or hoverPoint)
|
12688
|
+
} else if (followPointer && tooltip && !tooltip.isHidden) {
|
12689
|
+
anchor = tooltip.getAnchor([{}], e);
|
12690
|
+
tooltip.updatePosition({
|
12691
|
+
plotX: anchor[0],
|
12692
|
+
plotY: anchor[1]
|
12693
|
+
});
|
12473
12694
|
}
|
12474
12695
|
|
12475
12696
|
// Start the event listener to pick up the tooltip and crosshairs
|
12476
12697
|
if (!pointer.unDocMouseMove) {
|
12477
12698
|
pointer.unDocMouseMove = addEvent(doc, 'mousemove', function(e) {
|
12478
|
-
|
12479
|
-
|
12699
|
+
var chart = charts[H.hoverChartIndex];
|
12700
|
+
if (chart) {
|
12701
|
+
chart.pointer.onDocumentMouseMove(e);
|
12480
12702
|
}
|
12481
12703
|
});
|
12482
12704
|
}
|
12483
12705
|
|
12484
12706
|
// Crosshair. For each hover point, loop over axes and draw cross if that point
|
12485
12707
|
// belongs to the axis (#4927).
|
12486
|
-
each(
|
12708
|
+
each(points, function drawPointCrosshair(point) { // #5269
|
12487
12709
|
each(chart.axes, function drawAxisCrosshair(axis) {
|
12488
12710
|
// In case of snap = false, point is undefined, and we draw the crosshair anyway (#5066)
|
12489
12711
|
if (!point || point.series && point.series[axis.coll] === axis) { // #5658
|
@@ -12560,7 +12782,7 @@
|
|
12560
12782
|
axis.hideCrosshair();
|
12561
12783
|
});
|
12562
12784
|
|
12563
|
-
pointer.hoverX =
|
12785
|
+
pointer.hoverX = chart.hoverPoints = chart.hoverPoint = null;
|
12564
12786
|
}
|
12565
12787
|
},
|
12566
12788
|
|
@@ -12981,7 +13203,6 @@
|
|
12981
13203
|
*
|
12982
13204
|
* License: www.highcharts.com/license
|
12983
13205
|
*/
|
12984
|
-
'use strict';
|
12985
13206
|
var charts = H.charts,
|
12986
13207
|
each = H.each,
|
12987
13208
|
extend = H.extend,
|
@@ -13259,7 +13480,6 @@
|
|
13259
13480
|
*
|
13260
13481
|
* License: www.highcharts.com/license
|
13261
13482
|
*/
|
13262
|
-
'use strict';
|
13263
13483
|
var addEvent = H.addEvent,
|
13264
13484
|
charts = H.charts,
|
13265
13485
|
css = H.css,
|
@@ -13379,7 +13599,6 @@
|
|
13379
13599
|
*
|
13380
13600
|
* License: www.highcharts.com/license
|
13381
13601
|
*/
|
13382
|
-
'use strict';
|
13383
13602
|
var Legend,
|
13384
13603
|
|
13385
13604
|
addEvent = H.addEvent,
|
@@ -13387,7 +13606,6 @@
|
|
13387
13606
|
discardElement = H.discardElement,
|
13388
13607
|
defined = H.defined,
|
13389
13608
|
each = H.each,
|
13390
|
-
extend = H.extend,
|
13391
13609
|
isFirefox = H.isFirefox,
|
13392
13610
|
marginNames = H.marginNames,
|
13393
13611
|
merge = H.merge,
|
@@ -13580,7 +13798,17 @@
|
|
13580
13798
|
each(['legendItem', 'legendGroup'], destroyItems, item);
|
13581
13799
|
});
|
13582
13800
|
|
13583
|
-
|
13801
|
+
// Destroy legend elements
|
13802
|
+
each([
|
13803
|
+
'clipRect',
|
13804
|
+
'up',
|
13805
|
+
'down',
|
13806
|
+
'pager',
|
13807
|
+
'nav',
|
13808
|
+
'box',
|
13809
|
+
'title',
|
13810
|
+
'group'
|
13811
|
+
], destroyItems, this);
|
13584
13812
|
this.display = null; // Reset in .render on update.
|
13585
13813
|
},
|
13586
13814
|
|
@@ -13628,9 +13856,9 @@
|
|
13628
13856
|
zIndex: 1
|
13629
13857
|
})
|
13630
13858
|
|
13631
|
-
|
13859
|
+
.css(titleOptions.style)
|
13632
13860
|
|
13633
|
-
|
13861
|
+
.add(this.group);
|
13634
13862
|
}
|
13635
13863
|
bBox = this.title.getBBox();
|
13636
13864
|
titleHeight = bBox.height;
|
@@ -13702,15 +13930,15 @@
|
|
13702
13930
|
|
13703
13931
|
// Generate the list item text and add it to the group
|
13704
13932
|
item.legendItem = li = renderer.text(
|
13705
|
-
|
13706
|
-
|
13707
|
-
|
13708
|
-
|
13709
|
-
|
13933
|
+
'',
|
13934
|
+
ltr ? symbolWidth + symbolPadding : -symbolPadding,
|
13935
|
+
legend.baseline || 0,
|
13936
|
+
useHTML
|
13937
|
+
)
|
13710
13938
|
|
13711
|
-
|
13939
|
+
.css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)
|
13712
13940
|
|
13713
|
-
|
13941
|
+
.attr({
|
13714
13942
|
align: ltr ? 'left' : 'right',
|
13715
13943
|
zIndex: 2
|
13716
13944
|
})
|
@@ -13982,10 +14210,10 @@
|
|
13982
14210
|
}*/
|
13983
14211
|
|
13984
14212
|
if (display) {
|
13985
|
-
legendGroup.align(
|
14213
|
+
legendGroup.align(merge(options, {
|
13986
14214
|
width: legendWidth,
|
13987
14215
|
height: legendHeight
|
13988
|
-
}
|
14216
|
+
}), true, 'spacingBox');
|
13989
14217
|
}
|
13990
14218
|
|
13991
14219
|
if (!chart.isResizing) {
|
@@ -14093,9 +14321,9 @@
|
|
14093
14321
|
this.pager = renderer.text('', 15, 10)
|
14094
14322
|
.addClass('highcharts-legend-navigation')
|
14095
14323
|
|
14096
|
-
|
14324
|
+
.css(navOptions.style)
|
14097
14325
|
|
14098
|
-
|
14326
|
+
.add(nav);
|
14099
14327
|
this.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)
|
14100
14328
|
.on('click', function() {
|
14101
14329
|
legend.scroll(1, animation);
|
@@ -14111,7 +14339,7 @@
|
|
14111
14339
|
// Reset
|
14112
14340
|
} else if (nav) {
|
14113
14341
|
clipToHeight();
|
14114
|
-
nav.
|
14342
|
+
this.nav = nav.destroy(); // #6322
|
14115
14343
|
this.scrollGroup.attr({
|
14116
14344
|
translateY: 1
|
14117
14345
|
});
|
@@ -14329,7 +14557,6 @@
|
|
14329
14557
|
*
|
14330
14558
|
* License: www.highcharts.com/license
|
14331
14559
|
*/
|
14332
|
-
'use strict';
|
14333
14560
|
var addEvent = H.addEvent,
|
14334
14561
|
animate = H.animate,
|
14335
14562
|
animObject = H.animObject,
|
@@ -14416,7 +14643,6 @@
|
|
14416
14643
|
options = merge(defaultOptions, userOptions); // do the merge
|
14417
14644
|
options.series = userOptions.series = seriesOptions; // set back the series data
|
14418
14645
|
this.userOptions = userOptions;
|
14419
|
-
this.respRules = [];
|
14420
14646
|
|
14421
14647
|
var optionsChart = options.chart;
|
14422
14648
|
|
@@ -14565,8 +14791,7 @@
|
|
14565
14791
|
hasDirtyStacks,
|
14566
14792
|
hasCartesianSeries = chart.hasCartesianSeries,
|
14567
14793
|
isDirtyBox = chart.isDirtyBox,
|
14568
|
-
|
14569
|
-
i = seriesLength,
|
14794
|
+
i,
|
14570
14795
|
serie,
|
14571
14796
|
renderer = chart.renderer,
|
14572
14797
|
isHiddenChart = renderer.isHidden(),
|
@@ -14587,6 +14812,7 @@
|
|
14587
14812
|
chart.layOutTitles();
|
14588
14813
|
|
14589
14814
|
// link stacked series
|
14815
|
+
i = series.length;
|
14590
14816
|
while (i--) {
|
14591
14817
|
serie = series[i];
|
14592
14818
|
|
@@ -14600,7 +14826,7 @@
|
|
14600
14826
|
}
|
14601
14827
|
}
|
14602
14828
|
if (hasDirtyStacks) { // mark others as dirty
|
14603
|
-
i =
|
14829
|
+
i = series.length;
|
14604
14830
|
while (i--) {
|
14605
14831
|
serie = series[i];
|
14606
14832
|
if (serie.options.stacking) {
|
@@ -14948,7 +15174,10 @@
|
|
14948
15174
|
);
|
14949
15175
|
chart.chartHeight = Math.max(
|
14950
15176
|
0,
|
14951
|
-
|
15177
|
+
H.relativeLength(
|
15178
|
+
heightOption,
|
15179
|
+
chart.chartWidth
|
15180
|
+
) || chart.containerHeight || 400
|
14952
15181
|
);
|
14953
15182
|
},
|
14954
15183
|
|
@@ -15735,9 +15964,9 @@
|
|
15735
15964
|
zIndex: 8
|
15736
15965
|
})
|
15737
15966
|
|
15738
|
-
|
15967
|
+
.css(credits.style)
|
15739
15968
|
|
15740
|
-
|
15969
|
+
.add()
|
15741
15970
|
.align(credits.position);
|
15742
15971
|
|
15743
15972
|
// Dynamically update
|
@@ -15931,7 +16160,6 @@
|
|
15931
16160
|
*
|
15932
16161
|
* License: www.highcharts.com/license
|
15933
16162
|
*/
|
15934
|
-
'use strict';
|
15935
16163
|
var Point,
|
15936
16164
|
|
15937
16165
|
each = H.each,
|
@@ -16282,7 +16510,6 @@
|
|
16282
16510
|
*
|
16283
16511
|
* License: www.highcharts.com/license
|
16284
16512
|
*/
|
16285
|
-
'use strict';
|
16286
16513
|
var addEvent = H.addEvent,
|
16287
16514
|
animObject = H.animObject,
|
16288
16515
|
arrayMax = H.arrayMax,
|
@@ -16415,6 +16642,9 @@
|
|
16415
16642
|
states: { // states for the entire series
|
16416
16643
|
hover: {
|
16417
16644
|
//enabled: false,
|
16645
|
+
animation: {
|
16646
|
+
duration: 50
|
16647
|
+
},
|
16418
16648
|
lineWidthPlus: 1,
|
16419
16649
|
marker: {
|
16420
16650
|
// lineWidth: base + 1,
|
@@ -16440,7 +16670,7 @@
|
|
16440
16670
|
//ySuffix: ''
|
16441
16671
|
//}
|
16442
16672
|
turboThreshold: 1000
|
16443
|
-
|
16673
|
+
// zIndex: null
|
16444
16674
|
|
16445
16675
|
|
16446
16676
|
}, /** @lends Series.prototype */ {
|
@@ -17122,7 +17352,7 @@
|
|
17122
17352
|
|
17123
17353
|
// For points within the visible range, including the first point outside the
|
17124
17354
|
// visible range, consider y extremes
|
17125
|
-
validValue = (isNumber(y, true) || isArray(y)) && (!yAxis.
|
17355
|
+
validValue = (isNumber(y, true) || isArray(y)) && (!yAxis.positiveValuesOnly || (y.length || y > 0));
|
17126
17356
|
withinRange = this.getExtremesFromAll || this.options.getExtremesFromAll || this.cropped ||
|
17127
17357
|
((xData[i + 1] || x) >= xMin && (xData[i - 1] || x) <= xMax);
|
17128
17358
|
|
@@ -17196,7 +17426,7 @@
|
|
17196
17426
|
stackValues;
|
17197
17427
|
|
17198
17428
|
// Discard disallowed y values for log axes (#3434)
|
17199
|
-
if (yAxis.
|
17429
|
+
if (yAxis.positiveValuesOnly && yValue !== null && yValue <= 0) {
|
17200
17430
|
point.isNull = true;
|
17201
17431
|
}
|
17202
17432
|
|
@@ -17224,7 +17454,7 @@
|
|
17224
17454
|
if (yBottom === stackThreshold && stackIndicator.key === stack[xValue].base) {
|
17225
17455
|
yBottom = pick(threshold, yAxis.min);
|
17226
17456
|
}
|
17227
|
-
if (yAxis.
|
17457
|
+
if (yAxis.positiveValuesOnly && yBottom <= 0) { // #1200, #1232
|
17228
17458
|
yBottom = null;
|
17229
17459
|
}
|
17230
17460
|
|
@@ -17431,7 +17661,8 @@
|
|
17431
17661
|
globallyEnabled = pick(
|
17432
17662
|
seriesMarkerOptions.enabled,
|
17433
17663
|
xAxis.isRadial ? true : null,
|
17434
|
-
|
17664
|
+
// Use larger or equal as radius is null in bubbles (#6321)
|
17665
|
+
series.closestPointRangePx >= 2 * seriesMarkerOptions.radius
|
17435
17666
|
);
|
17436
17667
|
|
17437
17668
|
if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {
|
@@ -17982,6 +18213,15 @@
|
|
17982
18213
|
function setInvert() {
|
17983
18214
|
each(['group', 'markerGroup'], function(groupName) {
|
17984
18215
|
if (series[groupName]) {
|
18216
|
+
|
18217
|
+
// VML/HTML needs explicit attributes for flipping
|
18218
|
+
if (chart.renderer.isVML) {
|
18219
|
+
series[groupName].attr({
|
18220
|
+
width: series.yAxis.len,
|
18221
|
+
height: series.xAxis.len
|
18222
|
+
});
|
18223
|
+
}
|
18224
|
+
|
17985
18225
|
series[groupName].width = series.yAxis.len;
|
17986
18226
|
series[groupName].height = series.xAxis.len;
|
17987
18227
|
series[groupName].invert(inverted);
|
@@ -18329,7 +18569,6 @@
|
|
18329
18569
|
*
|
18330
18570
|
* License: www.highcharts.com/license
|
18331
18571
|
*/
|
18332
|
-
'use strict';
|
18333
18572
|
var Axis = H.Axis,
|
18334
18573
|
Chart = H.Chart,
|
18335
18574
|
correctFloat = H.correctFloat,
|
@@ -18815,7 +19054,6 @@
|
|
18815
19054
|
*
|
18816
19055
|
* License: www.highcharts.com/license
|
18817
19056
|
*/
|
18818
|
-
'use strict';
|
18819
19057
|
var addEvent = H.addEvent,
|
18820
19058
|
animate = H.animate,
|
18821
19059
|
Axis = H.Axis,
|
@@ -19063,6 +19301,7 @@
|
|
19063
19301
|
// options.title => chart.title
|
19064
19302
|
// options.tooltip => chart.tooltip
|
19065
19303
|
// options.subtitle => chart.subtitle
|
19304
|
+
// options.mapNavigation => chart.mapNavigation
|
19066
19305
|
// options.navigator => chart.navigator
|
19067
19306
|
// options.scrollbar => chart.scrollbar
|
19068
19307
|
for (key in options) {
|
@@ -19094,7 +19333,6 @@
|
|
19094
19333
|
// item in the collection, so setting one series without an id, will
|
19095
19334
|
// update the first series in the chart. Setting two series without
|
19096
19335
|
// an id will update the first and the second respectively (#6019)
|
19097
|
-
// // docs: New behaviour for unidentified items, add it to docs for
|
19098
19336
|
// chart.update and responsive.
|
19099
19337
|
each(['xAxis', 'yAxis', 'series'], function(coll) {
|
19100
19338
|
if (options[coll]) {
|
@@ -19194,9 +19432,15 @@
|
|
19194
19432
|
i = point.index;
|
19195
19433
|
series.updateParallelArrays(point, i);
|
19196
19434
|
|
19197
|
-
// Record the options to options.data. If
|
19198
|
-
// use point options, otherwise use raw options
|
19199
|
-
|
19435
|
+
// Record the options to options.data. If the old or the new config
|
19436
|
+
// is an object, use point options, otherwise use raw options
|
19437
|
+
// (#4701, #4916).
|
19438
|
+
seriesOptions.data[i] = (
|
19439
|
+
isObject(seriesOptions.data[i], true) ||
|
19440
|
+
isObject(options, true)
|
19441
|
+
) ?
|
19442
|
+
point.options :
|
19443
|
+
options;
|
19200
19444
|
|
19201
19445
|
// redraw
|
19202
19446
|
series.isDirty = series.isDirtyData = true;
|
@@ -19403,7 +19647,7 @@
|
|
19403
19647
|
// must use user options when changing type because this.options is merged
|
19404
19648
|
// in with type specific plotOptions
|
19405
19649
|
oldOptions = this.userOptions,
|
19406
|
-
oldType = this.type,
|
19650
|
+
oldType = this.oldType || this.type,
|
19407
19651
|
newType = newOptions.type || oldOptions.type || chart.options.chart.type,
|
19408
19652
|
proto = seriesTypes[oldType].prototype,
|
19409
19653
|
preserve = ['group', 'markerGroup', 'dataLabelsGroup'],
|
@@ -19443,6 +19687,7 @@
|
|
19443
19687
|
});
|
19444
19688
|
|
19445
19689
|
this.init(chart, newOptions);
|
19690
|
+
this.oldType = oldType;
|
19446
19691
|
chart.linkSeries(); // Links are lost in this.remove (#3028)
|
19447
19692
|
if (pick(redraw, true)) {
|
19448
19693
|
chart.redraw(false);
|
@@ -19533,7 +19778,6 @@
|
|
19533
19778
|
*
|
19534
19779
|
* License: www.highcharts.com/license
|
19535
19780
|
*/
|
19536
|
-
'use strict';
|
19537
19781
|
var color = H.color,
|
19538
19782
|
each = H.each,
|
19539
19783
|
LegendSymbolMixin = H.LegendSymbolMixin,
|
@@ -19550,10 +19794,10 @@
|
|
19550
19794
|
seriesType('area', 'line', {
|
19551
19795
|
softThreshold: false,
|
19552
19796
|
threshold: 0
|
19553
|
-
|
19554
|
-
|
19555
|
-
|
19556
|
-
|
19797
|
+
// trackByArea: false,
|
19798
|
+
// lineColor: null, // overrides color, but lets fillColor be unaltered
|
19799
|
+
// fillOpacity: 0.75,
|
19800
|
+
// fillColor: null
|
19557
19801
|
}, /** @lends seriesTypes.area.prototype */ {
|
19558
19802
|
singleStacks: false,
|
19559
19803
|
/**
|
@@ -19658,11 +19902,11 @@
|
|
19658
19902
|
// When reversedStacks is true, loop up, else loop down
|
19659
19903
|
i += upOrDown;
|
19660
19904
|
}
|
19661
|
-
|
19662
|
-
y = yAxis.toPixels(y, true);
|
19905
|
+
y = yAxis.translate(y, 0, 1, 0, 1); // #6272
|
19663
19906
|
segment.push({
|
19664
19907
|
isNull: true,
|
19665
|
-
plotX: xAxis.
|
19908
|
+
plotX: xAxis.translate(x, 0, 0, 0, 1), // #6272
|
19909
|
+
x: x,
|
19666
19910
|
plotY: y,
|
19667
19911
|
yBottom: y
|
19668
19912
|
});
|
@@ -19723,7 +19967,8 @@
|
|
19723
19967
|
graphPoints.push({
|
19724
19968
|
plotX: plotX,
|
19725
19969
|
plotY: top === null ? translatedThreshold : yAxis.getThreshold(top),
|
19726
|
-
isNull: isNull
|
19970
|
+
isNull: isNull,
|
19971
|
+
isCliff: true
|
19727
19972
|
});
|
19728
19973
|
bottomPoints.push({
|
19729
19974
|
plotX: plotX,
|
@@ -19780,6 +20025,7 @@
|
|
19780
20025
|
|
19781
20026
|
areaPath.xMap = topPath.xMap;
|
19782
20027
|
this.areaPath = areaPath;
|
20028
|
+
|
19783
20029
|
return graphPath;
|
19784
20030
|
},
|
19785
20031
|
|
@@ -19863,7 +20109,6 @@
|
|
19863
20109
|
*
|
19864
20110
|
* License: www.highcharts.com/license
|
19865
20111
|
*/
|
19866
|
-
'use strict';
|
19867
20112
|
var pick = H.pick,
|
19868
20113
|
seriesType = H.seriesType;
|
19869
20114
|
|
@@ -19890,7 +20135,10 @@
|
|
19890
20135
|
ret;
|
19891
20136
|
|
19892
20137
|
function doCurve(otherPoint) {
|
19893
|
-
return otherPoint &&
|
20138
|
+
return otherPoint &&
|
20139
|
+
!otherPoint.isNull &&
|
20140
|
+
otherPoint.doCurve !== false &&
|
20141
|
+
!point.isCliff; // #6387, area splines next to null
|
19894
20142
|
}
|
19895
20143
|
|
19896
20144
|
// Find control points
|
@@ -19999,7 +20247,6 @@
|
|
19999
20247
|
*
|
20000
20248
|
* License: www.highcharts.com/license
|
20001
20249
|
*/
|
20002
|
-
'use strict';
|
20003
20250
|
var areaProto = H.seriesTypes.area.prototype,
|
20004
20251
|
defaultPlotOptions = H.defaultPlotOptions,
|
20005
20252
|
LegendSymbolMixin = H.LegendSymbolMixin,
|
@@ -20022,7 +20269,6 @@
|
|
20022
20269
|
*
|
20023
20270
|
* License: www.highcharts.com/license
|
20024
20271
|
*/
|
20025
|
-
'use strict';
|
20026
20272
|
var animObject = H.animObject,
|
20027
20273
|
color = H.color,
|
20028
20274
|
each = H.each,
|
@@ -20082,7 +20328,7 @@
|
|
20082
20328
|
threshold: 0,
|
20083
20329
|
|
20084
20330
|
borderColor: '#ffffff'
|
20085
|
-
|
20331
|
+
// borderWidth: 1
|
20086
20332
|
|
20087
20333
|
|
20088
20334
|
}, /** @lends seriesTypes.column.prototype */ {
|
@@ -20343,7 +20589,10 @@
|
|
20343
20589
|
|
20344
20590
|
// Select or hover states
|
20345
20591
|
if (state) {
|
20346
|
-
stateOptions =
|
20592
|
+
stateOptions = merge(
|
20593
|
+
options.states[state],
|
20594
|
+
point.options.states && point.options.states[state] || {} // #6401
|
20595
|
+
);
|
20347
20596
|
brightness = stateOptions.brightness;
|
20348
20597
|
fill = stateOptions.color ||
|
20349
20598
|
(brightness !== undefined && color(fill).brighten(stateOptions.brightness).get()) ||
|
@@ -20398,9 +20647,6 @@
|
|
20398
20647
|
|
20399
20648
|
} else {
|
20400
20649
|
point.graphic = graphic = renderer[point.shapeType](shapeArgs)
|
20401
|
-
.attr({
|
20402
|
-
'class': point.getClassName()
|
20403
|
-
})
|
20404
20650
|
.add(point.group || series.group);
|
20405
20651
|
}
|
20406
20652
|
|
@@ -20411,6 +20657,9 @@
|
|
20411
20657
|
.shadow(options.shadow, null, options.stacking && !options.borderRadius);
|
20412
20658
|
|
20413
20659
|
|
20660
|
+
graphic.addClass(point.getClassName(), true);
|
20661
|
+
|
20662
|
+
|
20414
20663
|
} else if (graphic) {
|
20415
20664
|
point.graphic = graphic.destroy(); // #1269
|
20416
20665
|
}
|
@@ -20486,7 +20735,6 @@
|
|
20486
20735
|
*
|
20487
20736
|
* License: www.highcharts.com/license
|
20488
20737
|
*/
|
20489
|
-
'use strict';
|
20490
20738
|
|
20491
20739
|
var seriesType = H.seriesType;
|
20492
20740
|
|
@@ -20504,7 +20752,6 @@
|
|
20504
20752
|
*
|
20505
20753
|
* License: www.highcharts.com/license
|
20506
20754
|
*/
|
20507
|
-
'use strict';
|
20508
20755
|
var Series = H.Series,
|
20509
20756
|
seriesType = H.seriesType;
|
20510
20757
|
/**
|
@@ -20545,7 +20792,6 @@
|
|
20545
20792
|
*
|
20546
20793
|
* License: www.highcharts.com/license
|
20547
20794
|
*/
|
20548
|
-
'use strict';
|
20549
20795
|
var pick = H.pick,
|
20550
20796
|
relativeLength = H.relativeLength;
|
20551
20797
|
|
@@ -20595,7 +20841,6 @@
|
|
20595
20841
|
*
|
20596
20842
|
* License: www.highcharts.com/license
|
20597
20843
|
*/
|
20598
|
-
'use strict';
|
20599
20844
|
var addEvent = H.addEvent,
|
20600
20845
|
CenteredSeriesMixin = H.CenteredSeriesMixin,
|
20601
20846
|
defined = H.defined,
|
@@ -20633,7 +20878,7 @@
|
|
20633
20878
|
},
|
20634
20879
|
// softConnector: true,
|
20635
20880
|
x: 0
|
20636
|
-
|
20881
|
+
// y: 0
|
20637
20882
|
},
|
20638
20883
|
ignoreHiddenPoint: true,
|
20639
20884
|
//innerSize: 0,
|
@@ -20880,8 +21125,9 @@
|
|
20880
21125
|
shapeArgs = point.shapeArgs;
|
20881
21126
|
|
20882
21127
|
|
20883
|
-
//
|
20884
|
-
|
21128
|
+
// If the point is sliced, use special translation, else use
|
21129
|
+
// plot area traslation
|
21130
|
+
groupTranslation = point.getTranslate();
|
20885
21131
|
|
20886
21132
|
|
20887
21133
|
// Put the shadow behind all points
|
@@ -20902,13 +21148,12 @@
|
|
20902
21148
|
graphic
|
20903
21149
|
.setRadialReference(series.center)
|
20904
21150
|
|
20905
|
-
|
21151
|
+
.attr(pointAttr)
|
20906
21152
|
|
20907
|
-
|
21153
|
+
.animate(extend(shapeArgs, groupTranslation));
|
20908
21154
|
} else {
|
20909
21155
|
|
20910
21156
|
point.graphic = graphic = renderer[point.shapeType](shapeArgs)
|
20911
|
-
.addClass(point.getClassName())
|
20912
21157
|
.setRadialReference(series.center)
|
20913
21158
|
.attr(groupTranslation)
|
20914
21159
|
.add(series.group);
|
@@ -20928,6 +21173,9 @@
|
|
20928
21173
|
.shadow(shadow, shadowGroup);
|
20929
21174
|
|
20930
21175
|
}
|
21176
|
+
|
21177
|
+
graphic.addClass(point.getClassName());
|
21178
|
+
|
20931
21179
|
}
|
20932
21180
|
});
|
20933
21181
|
|
@@ -21043,8 +21291,7 @@
|
|
21043
21291
|
slice: function(sliced, redraw, animation) {
|
21044
21292
|
var point = this,
|
21045
21293
|
series = point.series,
|
21046
|
-
chart = series.chart
|
21047
|
-
translation;
|
21294
|
+
chart = series.chart;
|
21048
21295
|
|
21049
21296
|
setAnimation(animation, chart);
|
21050
21297
|
|
@@ -21055,20 +21302,22 @@
|
|
21055
21302
|
point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;
|
21056
21303
|
series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data
|
21057
21304
|
|
21058
|
-
|
21059
|
-
translateX: 0,
|
21060
|
-
translateY: 0
|
21061
|
-
};
|
21062
|
-
|
21063
|
-
point.graphic.animate(translation);
|
21305
|
+
point.graphic.animate(this.getTranslate());
|
21064
21306
|
|
21065
21307
|
|
21066
21308
|
if (point.shadowGroup) {
|
21067
|
-
point.shadowGroup.animate(
|
21309
|
+
point.shadowGroup.animate(this.getTranslate());
|
21068
21310
|
}
|
21069
21311
|
|
21070
21312
|
},
|
21071
21313
|
|
21314
|
+
getTranslate: function() {
|
21315
|
+
return this.sliced ? this.slicedTranslation : {
|
21316
|
+
translateX: 0,
|
21317
|
+
translateY: 0
|
21318
|
+
};
|
21319
|
+
},
|
21320
|
+
|
21072
21321
|
haloPath: function(size) {
|
21073
21322
|
var shapeArgs = this.shapeArgs;
|
21074
21323
|
|
@@ -21093,7 +21342,6 @@
|
|
21093
21342
|
*
|
21094
21343
|
* License: www.highcharts.com/license
|
21095
21344
|
*/
|
21096
|
-
'use strict';
|
21097
21345
|
var addEvent = H.addEvent,
|
21098
21346
|
arrayMax = H.arrayMax,
|
21099
21347
|
defined = H.defined,
|
@@ -21584,6 +21832,21 @@
|
|
21584
21832
|
return;
|
21585
21833
|
}
|
21586
21834
|
|
21835
|
+
// Reset all labels that have been shortened
|
21836
|
+
each(data, function(point) {
|
21837
|
+
if (point.dataLabel && point.visible && point.dataLabel.shortened) {
|
21838
|
+
point.dataLabel
|
21839
|
+
.attr({
|
21840
|
+
width: 'auto'
|
21841
|
+
}).css({
|
21842
|
+
width: 'auto',
|
21843
|
+
textOverflow: 'clip'
|
21844
|
+
});
|
21845
|
+
point.dataLabel.shortened = false;
|
21846
|
+
}
|
21847
|
+
});
|
21848
|
+
|
21849
|
+
|
21587
21850
|
// run parent method
|
21588
21851
|
Series.prototype.drawDataLabels.apply(series);
|
21589
21852
|
|
@@ -21608,6 +21871,7 @@
|
|
21608
21871
|
length = points.length,
|
21609
21872
|
positions,
|
21610
21873
|
naturalY,
|
21874
|
+
sideOverflow,
|
21611
21875
|
size;
|
21612
21876
|
|
21613
21877
|
if (!length) {
|
@@ -21683,24 +21947,39 @@
|
|
21683
21947
|
|
21684
21948
|
// Detect overflowing data labels
|
21685
21949
|
if (series.options.size === null) {
|
21686
|
-
dataLabelWidth = dataLabel.width;
|
21950
|
+
dataLabelWidth = dataLabel.getBBox().width;
|
21951
|
+
|
21952
|
+
sideOverflow = null;
|
21687
21953
|
// Overflow left
|
21688
21954
|
if (x - dataLabelWidth < connectorPadding) {
|
21689
|
-
|
21955
|
+
sideOverflow = Math.round(
|
21956
|
+
dataLabelWidth - x + connectorPadding
|
21957
|
+
);
|
21958
|
+
overflow[3] = Math.max(sideOverflow, overflow[3]);
|
21690
21959
|
|
21691
21960
|
// Overflow right
|
21692
21961
|
} else if (x + dataLabelWidth > plotWidth - connectorPadding) {
|
21693
|
-
|
21962
|
+
sideOverflow = Math.round(
|
21963
|
+
x + dataLabelWidth - plotWidth + connectorPadding
|
21964
|
+
);
|
21965
|
+
overflow[1] = Math.max(sideOverflow, overflow[1]);
|
21694
21966
|
}
|
21695
21967
|
|
21696
21968
|
// Overflow top
|
21697
21969
|
if (y - labelHeight / 2 < 0) {
|
21698
|
-
overflow[0] = Math.max(
|
21970
|
+
overflow[0] = Math.max(
|
21971
|
+
Math.round(-y + labelHeight / 2),
|
21972
|
+
overflow[0]
|
21973
|
+
);
|
21699
21974
|
|
21700
21975
|
// Overflow left
|
21701
21976
|
} else if (y + labelHeight / 2 > plotHeight) {
|
21702
|
-
overflow[2] = Math.max(
|
21977
|
+
overflow[2] = Math.max(
|
21978
|
+
Math.round(y + labelHeight / 2 - plotHeight),
|
21979
|
+
overflow[2]
|
21980
|
+
);
|
21703
21981
|
}
|
21982
|
+
dataLabel.sideOverflow = sideOverflow;
|
21704
21983
|
}
|
21705
21984
|
} // for each point
|
21706
21985
|
}); // for each half
|
@@ -21784,10 +22063,22 @@
|
|
21784
22063
|
each(this.points, function(point) {
|
21785
22064
|
var dataLabel = point.dataLabel,
|
21786
22065
|
_pos;
|
21787
|
-
|
21788
22066
|
if (dataLabel && point.visible) {
|
21789
22067
|
_pos = dataLabel._pos;
|
21790
22068
|
if (_pos) {
|
22069
|
+
|
22070
|
+
// Shorten data labels with ellipsis if they still overflow
|
22071
|
+
// after the pie has reached minSize (#223).
|
22072
|
+
if (dataLabel.sideOverflow) {
|
22073
|
+
dataLabel._attr.width =
|
22074
|
+
dataLabel.getBBox().width - dataLabel.sideOverflow;
|
22075
|
+
dataLabel.css({
|
22076
|
+
width: dataLabel._attr.width + 'px',
|
22077
|
+
textOverflow: 'ellipsis'
|
22078
|
+
});
|
22079
|
+
dataLabel.shortened = true;
|
22080
|
+
}
|
22081
|
+
|
21791
22082
|
dataLabel.attr(dataLabel._attr);
|
21792
22083
|
dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);
|
21793
22084
|
dataLabel.moved = true;
|
@@ -21797,7 +22088,7 @@
|
|
21797
22088
|
});
|
21798
22089
|
}
|
21799
22090
|
}
|
21800
|
-
});
|
22091
|
+
}, this);
|
21801
22092
|
};
|
21802
22093
|
|
21803
22094
|
seriesTypes.pie.prototype.alignDataLabel = noop;
|
@@ -21930,7 +22221,6 @@
|
|
21930
22221
|
*
|
21931
22222
|
* License: www.highcharts.com/license
|
21932
22223
|
*/
|
21933
|
-
'use strict';
|
21934
22224
|
/**
|
21935
22225
|
* Highcharts module to hide overlapping data labels. This module is included in Highcharts.
|
21936
22226
|
*/
|
@@ -21945,7 +22235,7 @@
|
|
21945
22235
|
function collectAndHide() {
|
21946
22236
|
var labels = [];
|
21947
22237
|
|
21948
|
-
each(chart.series, function(series) {
|
22238
|
+
each(chart.series || [], function(series) {
|
21949
22239
|
var dlOptions = series.options.dataLabels,
|
21950
22240
|
collections = series.dataLabelCollections || ['dataLabel']; // Range series have two collections
|
21951
22241
|
if ((dlOptions.enabled || series._hasPointLabels) && !dlOptions.allowOverlap && series.visible) { // #3866
|
@@ -22079,7 +22369,6 @@
|
|
22079
22369
|
*
|
22080
22370
|
* License: www.highcharts.com/license
|
22081
22371
|
*/
|
22082
|
-
'use strict';
|
22083
22372
|
var addEvent = H.addEvent,
|
22084
22373
|
Chart = H.Chart,
|
22085
22374
|
createElement = H.createElement,
|
@@ -22116,15 +22405,10 @@
|
|
22116
22405
|
chart = series.chart,
|
22117
22406
|
pointer = chart.pointer,
|
22118
22407
|
onMouseOver = function(e) {
|
22119
|
-
var
|
22120
|
-
point;
|
22408
|
+
var point = pointer.getPointFromEvent(e);
|
22121
22409
|
|
22122
|
-
|
22123
|
-
|
22124
|
-
target = target.parentNode;
|
22125
|
-
}
|
22126
|
-
|
22127
|
-
if (point !== undefined && point !== chart.hoverPoint) { // undefined on graph in scatterchart
|
22410
|
+
// undefined on graph in scatterchart
|
22411
|
+
if (point !== undefined) {
|
22128
22412
|
point.onMouseOver(e);
|
22129
22413
|
}
|
22130
22414
|
};
|
@@ -22299,7 +22583,7 @@
|
|
22299
22583
|
|
22300
22584
|
setItemEvents: function(item, legendItem, useHTML) {
|
22301
22585
|
var legend = this,
|
22302
|
-
|
22586
|
+
boxWrapper = legend.chart.renderer.boxWrapper,
|
22303
22587
|
activeClass = 'highcharts-legend-' + (item.series ? 'point' : 'series') + '-active';
|
22304
22588
|
|
22305
22589
|
// Set the events on the item group, or in case of useHTML, the item itself (#1249)
|
@@ -22307,7 +22591,7 @@
|
|
22307
22591
|
item.setState('hover');
|
22308
22592
|
|
22309
22593
|
// A CSS class to dim or hide other than the hovered series
|
22310
|
-
|
22594
|
+
boxWrapper.addClass(activeClass);
|
22311
22595
|
|
22312
22596
|
|
22313
22597
|
legendItem.css(legend.options.itemHoverStyle);
|
@@ -22319,7 +22603,7 @@
|
|
22319
22603
|
|
22320
22604
|
|
22321
22605
|
// A CSS class to dim or hide other than the hovered series
|
22322
|
-
|
22606
|
+
boxWrapper.removeClass(activeClass);
|
22323
22607
|
|
22324
22608
|
item.setState();
|
22325
22609
|
})
|
@@ -22501,8 +22785,14 @@
|
|
22501
22785
|
flipped = panMax < panMin,
|
22502
22786
|
newMin = flipped ? panMax : panMin,
|
22503
22787
|
newMax = flipped ? panMin : panMax,
|
22504
|
-
|
22505
|
-
|
22788
|
+
paddedMin = axis.toValue(
|
22789
|
+
axis.toPixels(extremes.min) - axis.minPixelPadding
|
22790
|
+
),
|
22791
|
+
paddedMax = axis.toValue(
|
22792
|
+
axis.toPixels(extremes.max) + axis.minPixelPadding
|
22793
|
+
),
|
22794
|
+
distMin = Math.min(extremes.dataMin, paddedMin) - newMin,
|
22795
|
+
distMax = newMax - Math.max(extremes.dataMax, paddedMax);
|
22506
22796
|
|
22507
22797
|
// Negative distMin and distMax means that we're still inside the
|
22508
22798
|
// data range.
|
@@ -22572,58 +22862,29 @@
|
|
22572
22862
|
|
22573
22863
|
/**
|
22574
22864
|
* Runs on mouse over the point
|
22575
|
-
*
|
22865
|
+
*
|
22576
22866
|
* @param {Object} e The event arguments
|
22577
|
-
* @param {Boolean} byProximity Falsy for kd points that are closest to the mouse, or to
|
22578
|
-
* actually hovered points. True for other points in shared tooltip.
|
22579
22867
|
*/
|
22580
|
-
onMouseOver: function(e
|
22868
|
+
onMouseOver: function(e) {
|
22581
22869
|
var point = this,
|
22582
22870
|
series = point.series,
|
22583
22871
|
chart = series.chart,
|
22584
|
-
|
22585
|
-
|
22586
|
-
|
22587
|
-
if (point.series) { // It may have been destroyed, #4130
|
22588
|
-
// In shared tooltip, call mouse over when point/series is actually hovered: (#5766)
|
22589
|
-
if (!byProximity) {
|
22590
|
-
// set normal state to previous series
|
22591
|
-
if (hoverPoint && hoverPoint !== point) {
|
22592
|
-
hoverPoint.onMouseOut();
|
22593
|
-
}
|
22594
|
-
if (chart.hoverSeries !== series) {
|
22595
|
-
series.onMouseOver();
|
22596
|
-
}
|
22597
|
-
chart.hoverPoint = point;
|
22598
|
-
}
|
22599
|
-
|
22600
|
-
// update the tooltip
|
22601
|
-
if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
|
22602
|
-
// hover point only for non shared points: (#5766)
|
22603
|
-
point.setState('hover');
|
22604
|
-
tooltip.refresh(point, e);
|
22605
|
-
} else if (!tooltip) {
|
22606
|
-
point.setState('hover');
|
22607
|
-
}
|
22608
|
-
|
22609
|
-
// trigger the event
|
22610
|
-
point.firePointEvent('mouseOver');
|
22611
|
-
}
|
22872
|
+
pointer = chart.pointer;
|
22873
|
+
point.firePointEvent('mouseOver');
|
22874
|
+
pointer.runPointActions(e, point);
|
22612
22875
|
},
|
22613
22876
|
|
22614
22877
|
/**
|
22615
22878
|
* Runs on mouse out from the point
|
22616
22879
|
*/
|
22617
22880
|
onMouseOut: function() {
|
22618
|
-
var
|
22619
|
-
|
22620
|
-
|
22621
|
-
|
22622
|
-
|
22623
|
-
|
22624
|
-
|
22625
|
-
chart.hoverPoint = null;
|
22626
|
-
}
|
22881
|
+
var point = this,
|
22882
|
+
chart = point.series.chart;
|
22883
|
+
point.firePointEvent('mouseOut');
|
22884
|
+
each(chart.hoverPoints || [], function(p) {
|
22885
|
+
p.setState();
|
22886
|
+
});
|
22887
|
+
chart.hoverPoints = chart.hoverPoint = null;
|
22627
22888
|
},
|
22628
22889
|
|
22629
22890
|
/**
|
@@ -22909,7 +23170,11 @@
|
|
22909
23170
|
if (series.state !== state) {
|
22910
23171
|
|
22911
23172
|
// Toggle class names
|
22912
|
-
each([
|
23173
|
+
each([
|
23174
|
+
series.group,
|
23175
|
+
series.markerGroup,
|
23176
|
+
series.dataLabelsGroup
|
23177
|
+
], function(group) {
|
22913
23178
|
if (group) {
|
22914
23179
|
// Old state
|
22915
23180
|
if (series.state) {
|
@@ -22938,8 +23203,16 @@
|
|
22938
23203
|
attribs = {
|
22939
23204
|
'stroke-width': lineWidth
|
22940
23205
|
};
|
22941
|
-
|
22942
|
-
graph.
|
23206
|
+
|
23207
|
+
// Animate the graph stroke-width. By default a quick animation
|
23208
|
+
// to hover, slower to un-hover.
|
23209
|
+
graph.animate(
|
23210
|
+
attribs,
|
23211
|
+
pick(
|
23212
|
+
series.chart.options.chart.animation,
|
23213
|
+
stateOptions[state] && stateOptions[state].animation
|
23214
|
+
)
|
23215
|
+
);
|
22943
23216
|
while (series['zone-graph-' + i]) {
|
22944
23217
|
series['zone-graph-' + i].attr(attribs);
|
22945
23218
|
i = i + 1;
|
@@ -23055,34 +23328,76 @@
|
|
23055
23328
|
*
|
23056
23329
|
* License: www.highcharts.com/license
|
23057
23330
|
*/
|
23058
|
-
'use strict';
|
23059
23331
|
var Chart = H.Chart,
|
23060
23332
|
each = H.each,
|
23061
23333
|
inArray = H.inArray,
|
23334
|
+
isArray = H.isArray,
|
23062
23335
|
isObject = H.isObject,
|
23063
23336
|
pick = H.pick,
|
23064
23337
|
splat = H.splat;
|
23065
23338
|
|
23066
23339
|
/**
|
23067
|
-
* Update the chart based on the current chart/document size and options for
|
23340
|
+
* Update the chart based on the current chart/document size and options for
|
23341
|
+
* responsiveness.
|
23068
23342
|
*/
|
23069
23343
|
Chart.prototype.setResponsive = function(redraw) {
|
23070
|
-
var options = this.options.responsive
|
23344
|
+
var options = this.options.responsive,
|
23345
|
+
ruleIds = [],
|
23346
|
+
currentResponsive = this.currentResponsive,
|
23347
|
+
currentRuleIds;
|
23071
23348
|
|
23072
23349
|
if (options && options.rules) {
|
23073
23350
|
each(options.rules, function(rule) {
|
23074
|
-
|
23351
|
+
if (rule._id === undefined) {
|
23352
|
+
rule._id = H.uniqueKey();
|
23353
|
+
}
|
23354
|
+
|
23355
|
+
this.matchResponsiveRule(rule, ruleIds, redraw);
|
23075
23356
|
}, this);
|
23076
23357
|
}
|
23358
|
+
|
23359
|
+
// Merge matching rules
|
23360
|
+
var mergedOptions = H.merge.apply(0, H.map(ruleIds, function(ruleId) {
|
23361
|
+
return H.find(options.rules, function(rule) {
|
23362
|
+
return rule._id === ruleId;
|
23363
|
+
}).chartOptions;
|
23364
|
+
}));
|
23365
|
+
|
23366
|
+
// Stringified key for the rules that currently apply.
|
23367
|
+
ruleIds = ruleIds.toString() || undefined;
|
23368
|
+
currentRuleIds = currentResponsive && currentResponsive.ruleIds;
|
23369
|
+
|
23370
|
+
|
23371
|
+
// Changes in what rules apply
|
23372
|
+
if (ruleIds !== currentRuleIds) {
|
23373
|
+
|
23374
|
+
// Undo previous rules. Before we apply a new set of rules, we need to
|
23375
|
+
// roll back completely to base options (#6291).
|
23376
|
+
if (currentResponsive) {
|
23377
|
+
this.update(currentResponsive.undoOptions, redraw);
|
23378
|
+
}
|
23379
|
+
|
23380
|
+
if (ruleIds) {
|
23381
|
+
// Get undo-options for matching rules
|
23382
|
+
this.currentResponsive = {
|
23383
|
+
ruleIds: ruleIds,
|
23384
|
+
mergedOptions: mergedOptions,
|
23385
|
+
undoOptions: this.currentOptions(mergedOptions)
|
23386
|
+
};
|
23387
|
+
|
23388
|
+
this.update(mergedOptions, redraw);
|
23389
|
+
|
23390
|
+
} else {
|
23391
|
+
this.currentResponsive = undefined;
|
23392
|
+
}
|
23393
|
+
}
|
23077
23394
|
};
|
23078
23395
|
|
23079
23396
|
/**
|
23080
23397
|
* Handle a single responsiveness rule
|
23081
23398
|
*/
|
23082
|
-
Chart.prototype.matchResponsiveRule = function(rule,
|
23083
|
-
var
|
23084
|
-
condition = rule.condition,
|
23085
|
-
matches,
|
23399
|
+
Chart.prototype.matchResponsiveRule = function(rule, matches) {
|
23400
|
+
var condition = rule.condition,
|
23086
23401
|
fn = condition.callback || function() {
|
23087
23402
|
return this.chartWidth <= pick(condition.maxWidth, Number.MAX_VALUE) &&
|
23088
23403
|
this.chartHeight <= pick(condition.maxHeight, Number.MAX_VALUE) &&
|
@@ -23090,27 +23405,10 @@
|
|
23090
23405
|
this.chartHeight >= pick(condition.minHeight, 0);
|
23091
23406
|
};
|
23092
23407
|
|
23093
|
-
|
23094
|
-
|
23095
|
-
rule._id = H.uniqueKey();
|
23408
|
+
if (fn.call(this)) {
|
23409
|
+
matches.push(rule._id);
|
23096
23410
|
}
|
23097
|
-
matches = fn.call(this);
|
23098
|
-
|
23099
|
-
// Apply a rule
|
23100
|
-
if (!respRules[rule._id] && matches) {
|
23101
|
-
|
23102
|
-
// Store the current state of the options
|
23103
|
-
if (rule.chartOptions) {
|
23104
|
-
respRules[rule._id] = this.currentOptions(rule.chartOptions);
|
23105
|
-
this.update(rule.chartOptions, redraw);
|
23106
|
-
}
|
23107
23411
|
|
23108
|
-
// Unapply a rule based on the previous options before the rule
|
23109
|
-
// was applied
|
23110
|
-
} else if (respRules[rule._id] && !matches) {
|
23111
|
-
this.update(respRules[rule._id], redraw);
|
23112
|
-
delete respRules[rule._id];
|
23113
|
-
}
|
23114
23412
|
};
|
23115
23413
|
|
23116
23414
|
/**
|
@@ -23133,17 +23431,22 @@
|
|
23133
23431
|
options[key] = splat(options[key]);
|
23134
23432
|
|
23135
23433
|
ret[key] = [];
|
23434
|
+
|
23435
|
+
// Iterate over collections like series, xAxis or yAxis and map
|
23436
|
+
// the items by index.
|
23136
23437
|
for (i = 0; i < options[key].length; i++) {
|
23137
|
-
|
23138
|
-
|
23139
|
-
|
23140
|
-
|
23141
|
-
|
23142
|
-
|
23143
|
-
|
23438
|
+
if (curr[key][i]) { // Item exists in current data (#6347)
|
23439
|
+
ret[key][i] = {};
|
23440
|
+
getCurrent(
|
23441
|
+
options[key][i],
|
23442
|
+
curr[key][i],
|
23443
|
+
ret[key][i],
|
23444
|
+
depth + 1
|
23445
|
+
);
|
23446
|
+
}
|
23144
23447
|
}
|
23145
23448
|
} else if (isObject(options[key])) {
|
23146
|
-
ret[key] = {};
|
23449
|
+
ret[key] = isArray(options[key]) ? [] : {};
|
23147
23450
|
getCurrent(
|
23148
23451
|
options[key],
|
23149
23452
|
curr[key] || {},
|