@@ -14,6 +14,7 @@ var Drawing = require('../drawing');
1414var Color = require ( '../color' ) ;
1515var dragElement = require ( '../dragelement' ) ;
1616var Axes = require ( '../../plots/cartesian/axes' ) ;
17+ var alignPeriod = require ( '../../plots/cartesian/align_period' ) ;
1718var Registry = require ( '../../registry' ) ;
1819
1920var helpers = require ( './helpers' ) ;
@@ -779,8 +780,9 @@ function createHoverText(hoverData, opts, gd) {
779780 var c0 = hoverData [ 0 ] ;
780781 var xa = c0 . xa ;
781782 var ya = c0 . ya ;
782- var commonAttr = hovermode . charAt ( 0 ) === 'y' ? 'yLabel' : 'xLabel' ;
783- var t0 = c0 [ commonAttr ] ;
783+ var axLetter = hovermode . charAt ( 0 ) ;
784+ var v0 = c0 [ axLetter + 'LabelVal' ] ;
785+ var t0 = c0 [ axLetter + 'Label' ] ;
784786 var t00 = ( String ( t0 ) || '' ) . split ( ' ' ) [ 0 ] ;
785787 var outerContainerBB = outerContainer . node ( ) . getBoundingClientRect ( ) ;
786788 var outerTop = outerContainerBB . top ;
@@ -978,23 +980,26 @@ function createHoverText(hoverData, opts, gd) {
978980
979981 function filterClosePoints ( hoverData ) {
980982 return hoverData . filter ( function ( d ) {
981- return ( d . zLabelVal !== undefined ) ||
982- ( d [ commonAttr ] || '' ) . split ( ' ' ) [ 0 ] === t00 ;
983- } ) ;
984- }
985-
986- function unifiedFilterClosePoints ( hoverData ) {
987- var out = [ ] ;
988- var seen = [ ] ;
989- for ( var i = 0 ; i < hoverData . length ; i ++ ) {
990- var d = hoverData [ i ] ;
991- var id = d . cd [ 0 ] . trace . index ;
992- if ( ! seen [ id ] ) {
993- seen [ id ] = 1 ;
994- out . push ( d ) ;
983+ if ( d . zLabelVal !== undefined ) return true ;
984+ if ( ( d [ axLetter + 'Label' ] || '' ) . split ( ' ' ) [ 0 ] === t00 ) return true ;
985+ if ( d . trace [ axLetter + 'period' ] ) {
986+ var v = d [ axLetter + 'LabelVal' ] ;
987+ var ax = d [ axLetter + 'a' ] ;
988+ var trace = { } ;
989+ trace [ axLetter + 'period' ] = d . trace [ axLetter + 'period' ] ;
990+ trace [ axLetter + 'period0' ] = d . trace [ axLetter + 'period0' ] ;
991+
992+ trace [ axLetter + 'periodalignment' ] = 'start' ;
993+
994+ var start = alignPeriod ( trace , ax , axLetter , [ v ] ) [ 0 ] ;
995+ trace [ axLetter + 'periodalignment' ] = 'end' ;
996+ var end = alignPeriod ( trace , ax , axLetter , [ v ] ) [ 0 ] ;
997+
998+ if ( v0 >= start && v0 <= end ) return true ;
995999 }
996- }
997- return out ;
1000+
1001+ return false ;
1002+ } ) ;
9981003 }
9991004
10001005 // Show a single hover label
@@ -1003,7 +1008,7 @@ function createHoverText(hoverData, opts, gd) {
10031008 container . selectAll ( 'g.hovertext' ) . remove ( ) ;
10041009
10051010 // similarly to compare mode, we remove the "close but not quite together" points
1006- if ( ( t0 !== undefined ) && ( c0 . distance <= opts . hoverdistance ) ) hoverData = unifiedFilterClosePoints ( hoverData ) ;
1011+ if ( ( t0 !== undefined ) && ( c0 . distance <= opts . hoverdistance ) ) hoverData = filterClosePoints ( hoverData ) ;
10071012
10081013 // Return early if nothing is hovered on
10091014 if ( hoverData . length === 0 ) return ;
0 commit comments