highcharts-rails 4.1.6 → 4.1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 20d000bd52b08e8dd4a7376d96a3a9f76e41276a
4
- data.tar.gz: ef3d6781527923bce73e358926c4befc2e85d4eb
3
+ metadata.gz: d4a6a629f316d30ec0202c1d30132ca75b330e5c
4
+ data.tar.gz: b4159b1bce4ad88d4338a7743b8d659747cddf70
5
5
  SHA512:
6
- metadata.gz: 2a94fc86214d938de0f8cab679f489978cc6ff272656dd7c2172f62dcf192b92ceea747f39e427519b11da95487807f6d3323ba3813b28107e15a9246846d4a3
7
- data.tar.gz: e9c7523d2c44dba8d99512eaabc532b8c977b5a3d1633ca05449fa57c75b19c52b361a65ea8cf90972ab2c81acba8c9e5d4b74db3ae53c3b8b3b9d7c5e8e9c9f
6
+ metadata.gz: 4ccdfb6d73da784b1e673e9a6ee7de7fa967cb6320a5926ea682f5d3a84dbd84f77cf764ac3c87886bb9a31ed44fd06d2a1b83f5b0b7b5b2a57c7ec41a9ef36c
7
+ data.tar.gz: 86f0408ebf477bcdbd8b921b51e18e53ebe8abbdba1da92aa1ac2dd425e7f2082c4909929aa3a5214f06392bff582cbebcf46480dd2c299d9e82a929d2a356a5
data/CHANGELOG.markdown CHANGED
@@ -1,3 +1,30 @@
1
+ # 4.1.7 / 2015-08-31
2
+
3
+ * Updated Highcharts to 4.1.7 (2015-06-26)
4
+ * Added new option, drilldown.allowPointDrilldown, that can be set to false to allow only drilling to categories. Closes #4295.
5
+ * Added support for useHTML in legend navigation.
6
+ * Added useHTML option to no-data-to-display module. Closes #4316.
7
+ * Fixed #2911, JS error when drilldown and allowPointSelect were enabled at the same time.
8
+ * Fixed #3318, gauge background altered background on polar charts in the same page.
9
+ * Fixed #3650, updating a point from zero in 3d pies.
10
+ * Fixed #3709, crash when showing/hiding linked series and setting data at the same time.
11
+ * Fixed #3941, added option to turn off axis label ellipsis through text-overflow style.
12
+ * Fixed #4130, errors when running Series.update from the series' own events.
13
+ * Fixed #4170, halo was still visible after hiding pie slice.
14
+ * Fixed #4233, columns and areas ascended from botton when threshold was null and all values negative. Closed #4282.
15
+ * Fixed #4275, when null points were present inside an axis break, connectNulls: false did not have an effect.
16
+ * Fixed #4280, 3D for inverted charts was disabled.
17
+ * Fixed #4284, a regression causing columns to disappear after Point.update with an object argument.
18
+ * Fixed #4291, number suffixes like k and M was applied to non-round tick labels.
19
+ * Fixed #4301, point update on solid gauge gave wrong animation.
20
+ * Fixed #4308, graphs were clipped to axis line even when it was offset.
21
+ * Fixed #4309, JS error in Firefox when rendering chart inside an iframe with display:none.
22
+ * Fixed #4310, point hovering was unstable when stickyTracking was false and point markers disabled in normal state.
23
+ * Fixed #4318, ignoreHiddenPoint didn't take effect for funnels.
24
+ * Fixed #4319, tooltip was broken on canvas heatmap demo.
25
+ * Fixed bad translation from broken axis pixels to values. Part of #4229.
26
+ * Fixed issue with Batik powered exporting and IE8. Invalid SVG tag.
27
+
1
28
  # 4.1.6 / 2015-08-31
2
29
 
3
30
  * Updated Highcharts to 4.1.6 (2015-06-12)
@@ -2,7 +2,7 @@
2
2
  // @compilation_level SIMPLE_OPTIMIZATIONS
3
3
 
4
4
  /**
5
- * @license Highcharts JS v4.1.6 (2015-06-12)
5
+ * @license Highcharts JS v4.1.7 (2015-06-26)
6
6
  *
7
7
  * (c) 2009-2014 Torstein Honsi
8
8
  *
@@ -56,7 +56,7 @@ var UNDEFINED,
56
56
  charts = [],
57
57
  chartCount = 0,
58
58
  PRODUCT = 'Highcharts',
59
- VERSION = '4.1.6',
59
+ VERSION = '4.1.7',
60
60
 
61
61
  // some constants for frequently used strings
62
62
  DIV = 'div',
@@ -1268,8 +1268,8 @@ defaultOptions = {
1268
1268
  global: {
1269
1269
  useUTC: true,
1270
1270
  //timezoneOffset: 0,
1271
- canvasToolsURL: 'http://code.highcharts.com/4.1.6/modules/canvas-tools.js',
1272
- VMLRadialGradientURL: 'http://code.highcharts.com/4.1.6/gfx/vml-radial-gradient.png'
1271
+ canvasToolsURL: 'http://code.highcharts.com/4.1.7/modules/canvas-tools.js',
1272
+ VMLRadialGradientURL: 'http://code.highcharts.com/4.1.7/gfx/vml-radial-gradient.png'
1273
1273
  },
1274
1274
  chart: {
1275
1275
  //animation: true,
@@ -2843,7 +2843,11 @@ SVGElement.prototype = {
2843
2843
  titleNode = doc.createElementNS(SVG_NS, 'title');
2844
2844
  this.element.appendChild(titleNode);
2845
2845
  }
2846
- titleNode.textContent = (String(pick(value), '')).replace(/<[^>]*>/g, ''); // #3276 #3895
2846
+ titleNode.appendChild(
2847
+ doc.createTextNode(
2848
+ (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895
2849
+ )
2850
+ );
2847
2851
  },
2848
2852
  textSetter: function (value) {
2849
2853
  if (value !== this.textStr) {
@@ -4035,17 +4039,22 @@ SVGRenderer.prototype = {
4035
4039
  * Utility to return the baseline offset and total line height from the font size
4036
4040
  */
4037
4041
  fontMetrics: function (fontSize, elem) {
4042
+ var lineHeight,
4043
+ baseline,
4044
+ style;
4045
+
4038
4046
  fontSize = fontSize || this.style.fontSize;
4039
4047
  if (elem && win.getComputedStyle) {
4040
4048
  elem = elem.element || elem; // SVGElement
4041
- fontSize = win.getComputedStyle(elem, "").fontSize;
4049
+ style = win.getComputedStyle(elem, "");
4050
+ fontSize = style && style.fontSize; // #4309, the style doesn't exist inside a hidden iframe in Firefox
4042
4051
  }
4043
4052
  fontSize = /px/.test(fontSize) ? pInt(fontSize) : /em/.test(fontSize) ? parseFloat(fontSize) * 12 : 12;
4044
4053
 
4045
4054
  // Empirical values found by comparing font size and bounding box height.
4046
4055
  // Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/
4047
- var lineHeight = fontSize < 24 ? fontSize + 3 : mathRound(fontSize * 1.2),
4048
- baseline = mathRound(lineHeight * 0.8);
4056
+ lineHeight = fontSize < 24 ? fontSize + 3 : mathRound(fontSize * 1.2);
4057
+ baseline = mathRound(lineHeight * 0.8);
4049
4058
 
4050
4059
  return {
4051
4060
  h: lineHeight,
@@ -4599,13 +4608,16 @@ extend(SVGRenderer.prototype, {
4599
4608
 
4600
4609
  // Ensure dynamically updating position when any parent is translated
4601
4610
  each(parents.reverse(), function (parentGroup) {
4602
- var htmlGroupStyle;
4611
+ var htmlGroupStyle,
4612
+ cls = attr(parentGroup.element, 'class');
4613
+
4614
+ if (cls) {
4615
+ cls = { className: cls };
4616
+ } // else null
4603
4617
 
4604
4618
  // Create a HTML div and append it to the parent div to emulate
4605
4619
  // the SVG group structure
4606
- htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {
4607
- className: attr(parentGroup.element, 'class')
4608
- }, {
4620
+ htmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, cls, {
4609
4621
  position: ABSOLUTE,
4610
4622
  left: (parentGroup.translateX || 0) + PX,
4611
4623
  top: (parentGroup.translateY || 0) + PX
@@ -5892,8 +5904,8 @@ Tick.prototype = {
5892
5904
  pxPos = xy.x,
5893
5905
  chartWidth = axis.chart.chartWidth,
5894
5906
  spacing = axis.chart.spacing,
5895
- leftBound = pick(axis.labelLeft, spacing[3]),
5896
- rightBound = pick(axis.labelRight, chartWidth - spacing[1]),
5907
+ leftBound = pick(axis.labelLeft, mathMin(axis.pos, spacing[3])),
5908
+ rightBound = pick(axis.labelRight, mathMax(axis.pos + axis.len, chartWidth - spacing[1])),
5897
5909
  label = this.label,
5898
5910
  rotation = this.rotation,
5899
5911
  factor = { left: 0, center: 0.5, right: 1 }[axis.labelAlign],
@@ -5903,7 +5915,8 @@ Tick.prototype = {
5903
5915
  goRight = 1,
5904
5916
  leftPos,
5905
5917
  rightPos,
5906
- textWidth;
5918
+ textWidth,
5919
+ css = {};
5907
5920
 
5908
5921
  // Check if the label overshoots the chart spacing box. If it does, move it.
5909
5922
  // If it now overshoots the slotWidth, add ellipsis.
@@ -5937,10 +5950,11 @@ Tick.prototype = {
5937
5950
  }
5938
5951
 
5939
5952
  if (textWidth) {
5940
- label.css({
5941
- width: textWidth,
5942
- textOverflow: 'ellipsis'
5943
- });
5953
+ css.width = textWidth;
5954
+ if (!axis.options.labels.style.textOverflow) {
5955
+ css.textOverflow = 'ellipsis';
5956
+ }
5957
+ label.css(css);
5944
5958
  }
5945
5959
  },
5946
5960
 
@@ -6818,7 +6832,7 @@ Axis.prototype = {
6818
6832
  // logic to the numberFormatter and enable it by a parameter.
6819
6833
  while (i-- && ret === UNDEFINED) {
6820
6834
  multi = Math.pow(1000, i + 1);
6821
- if (numericSymbolDetector >= multi && numericSymbols[i] !== null) {
6835
+ if (numericSymbolDetector >= multi && (value * 10) % multi === 0 && numericSymbols[i] !== null) {
6822
6836
  ret = Highcharts.numberFormat(value / multi, -1) + numericSymbols[i];
6823
6837
  }
6824
6838
  }
@@ -6826,7 +6840,7 @@ Axis.prototype = {
6826
6840
 
6827
6841
  if (ret === UNDEFINED) {
6828
6842
  if (mathAbs(value) >= 10000) { // add thousands separators
6829
- ret = Highcharts.numberFormat(value, 0);
6843
+ ret = Highcharts.numberFormat(value, -1);
6830
6844
 
6831
6845
  } else { // small numbers
6832
6846
  ret = Highcharts.numberFormat(value, -1, UNDEFINED, ''); // #2466
@@ -7841,12 +7855,15 @@ Axis.prototype = {
7841
7855
  */
7842
7856
  getThreshold: function (threshold) {
7843
7857
  var axis = this,
7844
- isLog = axis.isLog;
7845
-
7846
- var realMin = isLog ? lin2log(axis.min) : axis.min,
7858
+ isLog = axis.isLog,
7859
+ realMin = isLog ? lin2log(axis.min) : axis.min,
7847
7860
  realMax = isLog ? lin2log(axis.max) : axis.max;
7848
7861
 
7849
- if (realMin > threshold || threshold === null) {
7862
+ // With a threshold of null, make the columns/areas rise from the top or bottom
7863
+ // depending on the value, assuming an actual threshold of 0 (#4233).
7864
+ if (threshold === null) {
7865
+ threshold = realMax < 0 ? realMax : realMin;
7866
+ } else if (realMin > threshold) {
7850
7867
  threshold = realMin;
7851
7868
  } else if (realMax < threshold) {
7852
7869
  threshold = realMax;
@@ -7951,6 +7968,7 @@ Axis.prototype = {
7951
7968
  innerWidth = mathMax(1, mathRound(slotWidth - 2 * (labelOptions.padding || 5))),
7952
7969
  attr = {},
7953
7970
  labelMetrics = renderer.fontMetrics(labelOptions.style.fontSize, ticks[0] && ticks[0].label),
7971
+ textOverflowOption = labelOptions.style.textOverflow,
7954
7972
  css,
7955
7973
  labelLength = 0,
7956
7974
  label,
@@ -7984,20 +8002,24 @@ Axis.prototype = {
7984
8002
  // Handle word-wrap or ellipsis on vertical axis
7985
8003
  } else if (slotWidth) {
7986
8004
  // For word-wrap or ellipsis
7987
- css = { width: innerWidth + PX, textOverflow: 'clip' };
7988
-
7989
- // On vertical axis, only allow word wrap if there is room for more lines.
7990
- i = tickPositions.length;
7991
- while (!horiz && i--) {
7992
- pos = tickPositions[i];
7993
- label = ticks[pos].label;
7994
- if (label) {
7995
- // Reset ellipsis in order to get the correct bounding box (#4070)
7996
- if (label.styles.textOverflow === 'ellipsis') {
7997
- label.css({ textOverflow: 'clip' });
7998
- }
7999
- if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {
8000
- label.specCss = { textOverflow: 'ellipsis' };
8005
+ css = { width: innerWidth + PX };
8006
+
8007
+ if (!textOverflowOption) {
8008
+ css.textOverflow = 'clip';
8009
+
8010
+ // On vertical axis, only allow word wrap if there is room for more lines.
8011
+ i = tickPositions.length;
8012
+ while (!horiz && i--) {
8013
+ pos = tickPositions[i];
8014
+ label = ticks[pos].label;
8015
+ if (label) {
8016
+ // Reset ellipsis in order to get the correct bounding box (#4070)
8017
+ if (label.styles.textOverflow === 'ellipsis') {
8018
+ label.css({ textOverflow: 'clip' });
8019
+ }
8020
+ if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {
8021
+ label.specCss = { textOverflow: 'ellipsis' };
8022
+ }
8001
8023
  }
8002
8024
  }
8003
8025
  }
@@ -8007,9 +8029,11 @@ Axis.prototype = {
8007
8029
  // Add ellipsis if the label length is significantly longer than ideal
8008
8030
  if (attr.rotation) {
8009
8031
  css = {
8010
- width: (labelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + PX,
8011
- textOverflow: 'ellipsis'
8032
+ width: (labelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + PX
8012
8033
  };
8034
+ if (!textOverflowOption) {
8035
+ css.textOverflow = 'ellipsis';
8036
+ }
8013
8037
  }
8014
8038
 
8015
8039
  // Set the explicit or automatic label alignment
@@ -8033,6 +8057,13 @@ Axis.prototype = {
8033
8057
  this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side === 2);
8034
8058
  },
8035
8059
 
8060
+ /**
8061
+ * Return true if the axis has associated data
8062
+ */
8063
+ hasData: function () {
8064
+ return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);
8065
+ },
8066
+
8036
8067
  /**
8037
8068
  * Render the tick labels to a preliminary position to get their sizes
8038
8069
  */
@@ -8057,12 +8088,13 @@ Axis.prototype = {
8057
8088
  labelOffsetPadded,
8058
8089
  axisOffset = chart.axisOffset,
8059
8090
  clipOffset = chart.clipOffset,
8091
+ clip,
8060
8092
  directionFactor = [-1, 1, 1, -1][side],
8061
8093
  n,
8062
8094
  lineHeightCorrection;
8063
8095
 
8064
8096
  // For reuse in Axis.render
8065
- axis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));
8097
+ hasData = axis.hasData();
8066
8098
  axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);
8067
8099
 
8068
8100
  // Set/reset staggerLines
@@ -8165,7 +8197,13 @@ Axis.prototype = {
8165
8197
  axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,
8166
8198
  labelOffsetPadded // #3027
8167
8199
  );
8168
- clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);
8200
+
8201
+ // 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
+ }
8206
+ clipOffset[invertedSide] = mathMax(clipOffset[invertedSide], clip);
8169
8207
  },
8170
8208
 
8171
8209
  /**
@@ -8264,7 +8302,6 @@ Axis.prototype = {
8264
8302
  linePath,
8265
8303
  hasRendered = chart.hasRendered,
8266
8304
  slideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),
8267
- hasData = axis.hasData,
8268
8305
  showAxis = axis.showAxis,
8269
8306
  from,
8270
8307
  to;
@@ -8283,7 +8320,7 @@ Axis.prototype = {
8283
8320
  });
8284
8321
 
8285
8322
  // If the series has data draw the ticks. Else only the line and title
8286
- if (hasData || isLinked) {
8323
+ if (axis.hasData() || isLinked) {
8287
8324
 
8288
8325
  // minor ticks
8289
8326
  if (axis.minorTickInterval && !axis.categories) {
@@ -10966,8 +11003,20 @@ Legend.prototype = {
10966
11003
  arrowSize = navOptions.arrowSize || 12,
10967
11004
  nav = this.nav,
10968
11005
  pages = this.pages,
11006
+ padding = this.padding,
10969
11007
  lastY,
10970
- allItems = this.allItems;
11008
+ allItems = this.allItems,
11009
+ clipToHeight = function (height) {
11010
+ clipRect.attr({
11011
+ height: height
11012
+ });
11013
+
11014
+ // useHTML
11015
+ if (legend.contentGroup.div) {
11016
+ legend.contentGroup.div.style.clip = 'rect(' + padding + 'px,9999px,' + (padding + height) + 'px,0)';
11017
+ }
11018
+ };
11019
+
10971
11020
 
10972
11021
  // Adjust the height
10973
11022
  if (options.layout === 'horizontal') {
@@ -10979,9 +11028,9 @@ Legend.prototype = {
10979
11028
 
10980
11029
  // Reset the legend height and adjust the clipping rectangle
10981
11030
  pages.length = 0;
10982
- if (legendHeight > spaceHeight && !options.useHTML) {
11031
+ if (legendHeight > spaceHeight) {
10983
11032
 
10984
- this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - this.padding, 0);
11033
+ this.clipHeight = clipHeight = mathMax(spaceHeight - 20 - this.titleHeight - padding, 0);
10985
11034
  this.currentPage = pick(this.currentPage, 1);
10986
11035
  this.fullHeight = legendHeight;
10987
11036
 
@@ -11007,13 +11056,12 @@ Legend.prototype = {
11007
11056
 
11008
11057
  // Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)
11009
11058
  if (!clipRect) {
11010
- clipRect = legend.clipRect = renderer.clipRect(0, this.padding, 9999, 0);
11059
+ clipRect = legend.clipRect = renderer.clipRect(0, padding, 9999, 0);
11011
11060
  legend.contentGroup.clip(clipRect);
11012
11061
  }
11013
- clipRect.attr({
11014
- height: clipHeight
11015
- });
11016
-
11062
+
11063
+ clipToHeight(clipHeight);
11064
+
11017
11065
  // Add navigation elements
11018
11066
  if (!nav) {
11019
11067
  this.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);
@@ -11038,9 +11086,7 @@ Legend.prototype = {
11038
11086
  legendHeight = spaceHeight;
11039
11087
 
11040
11088
  } else if (nav) {
11041
- clipRect.attr({
11042
- height: chart.chartHeight
11043
- });
11089
+ clipToHeight(chart.chartHeight);
11044
11090
  nav.hide();
11045
11091
  this.scrollGroup.attr({
11046
11092
  translateY: 1
@@ -12911,7 +12957,9 @@ Point.prototype = {
12911
12957
  if (eventType === 'click' && seriesOptions.allowPointSelect) {
12912
12958
  defaultFunction = function (event) {
12913
12959
  // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera
12914
- point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
12960
+ if (point.select) { // Could be destroyed by prior event handlers (#2911)
12961
+ point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);
12962
+ }
12915
12963
  };
12916
12964
  }
12917
12965
 
@@ -13299,7 +13347,9 @@ Series.prototype = {
13299
13347
  // cheaper, allows animation, and keeps references to points.
13300
13348
  if (updatePoints !== false && dataLength && oldDataLength === dataLength && !series.cropped && !series.hasGroupedData && series.visible) {
13301
13349
  each(data, function (point, i) {
13302
- oldData[i].update(point, false, null, false);
13350
+ if (oldData[i].update) { // Linked, previously hidden series (#3709)
13351
+ oldData[i].update(point, false, null, false);
13352
+ }
13303
13353
  });
13304
13354
 
13305
13355
  } else {
@@ -15260,7 +15310,7 @@ extend(Point.prototype, {
15260
15310
  if (options && options.marker && options.marker.symbol) {
15261
15311
  point.graphic = graphic.destroy();
15262
15312
  } else {
15263
- graphic.attr(point.pointAttr[point.state || ''])[point.visible ? 'show' : 'hide'](true); // #2430
15313
+ graphic.attr(point.pointAttr[point.state || ''])[point.visible === false ? 'hide' : 'show'](); // #2430
15264
15314
  }
15265
15315
  }
15266
15316
  if (options && options.dataLabels && point.dataLabel) { // #2468
@@ -15561,7 +15611,7 @@ extend(Axis.prototype, {
15561
15611
  newOptions = chart.options[this.coll][this.options.index] = merge(this.userOptions, newOptions);
15562
15612
 
15563
15613
  this.destroy(true);
15564
- this._addedPlotLB = UNDEFINED; // #1611, #2887
15614
+ this._addedPlotLB = this.chart._labelPanes = UNDEFINED; // #1611, #2887, #4314
15565
15615
 
15566
15616
  this.init(chart, extend(newOptions, { events: UNDEFINED }));
15567
15617
 
@@ -16491,6 +16541,11 @@ var PiePoint = extendClass(Point, {
16491
16541
  if (point.legendItem) {
16492
16542
  chart.legend.colorizeItem(point, vis);
16493
16543
  }
16544
+
16545
+ // #4170, hide halo after hiding point
16546
+ if (!vis && point.state === 'hover') {
16547
+ point.setState('');
16548
+ }
16494
16549
 
16495
16550
  // Handle ignore hidden slices
16496
16551
  if (ignoreHiddenPoint) {
@@ -17625,7 +17680,7 @@ if (seriesTypes.column) {
17625
17680
 
17626
17681
 
17627
17682
  /**
17628
- * Highcharts JS v4.1.6 (2015-06-12)
17683
+ * Highcharts JS v4.1.7 (2015-06-26)
17629
17684
  * Highcharts module to hide overlapping data labels. This module is included by default in Highmaps.
17630
17685
  *
17631
17686
  * (c) 2010-2014 Torstein Honsi
@@ -18149,17 +18204,20 @@ extend(Point.prototype, {
18149
18204
  hoverPoint.onMouseOut();
18150
18205
  }
18151
18206
 
18152
- // trigger the event
18153
- point.firePointEvent('mouseOver');
18207
+ if (point.series) { // It may have been destroyed, #4130
18154
18208
 
18155
- // update the tooltip
18156
- if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
18157
- tooltip.refresh(point, e);
18158
- }
18209
+ // trigger the event
18210
+ point.firePointEvent('mouseOver');
18159
18211
 
18160
- // hover this
18161
- point.setState(HOVER_STATE);
18162
- chart.hoverPoint = point;
18212
+ // update the tooltip
18213
+ if (tooltip && (!tooltip.shared || series.noSharedTooltip)) {
18214
+ tooltip.refresh(point, e);
18215
+ }
18216
+
18217
+ // hover this
18218
+ point.setState(HOVER_STATE);
18219
+ chart.hoverPoint = point;
18220
+ }
18163
18221
  },
18164
18222
 
18165
18223
  /**
@@ -18296,6 +18354,7 @@ extend(Point.prototype, {
18296
18354
 
18297
18355
  if (stateMarkerGraphic) {
18298
18356
  stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450
18357
+ stateMarkerGraphic.element.point = point; // #4310
18299
18358
  }
18300
18359
  }
18301
18360