@@ -27,9 +27,12 @@ var ONEHOUR = numConstants.ONEHOUR;
2727var ONEMIN = numConstants . ONEMIN ;
2828var ONESEC = numConstants . ONESEC ;
2929
30- var constants = require ( './constants' ) ;
3130var axisIds = require ( './axis_ids' ) ;
3231
32+ var constants = require ( './constants' ) ;
33+ var HOUR_PATTERN = constants . HOUR_PATTERN ;
34+ var WEEKDAY_PATTERN = constants . WEEKDAY_PATTERN ;
35+
3336function fromLog ( v ) {
3437 return Math . pow ( 10 , v ) ;
3538}
@@ -611,7 +614,7 @@ module.exports = function setConvert(ax, fullLayout) {
611614
612615 ax . maskBreaks = function ( v ) {
613616 var rangebreaksIn = ax . rangebreaks || [ ] ;
614- var bnds , b0 , b1 , vb ;
617+ var bnds , b0 , b1 , vb , vDate ;
615618
616619 for ( var i = 0 ; i < rangebreaksIn . length ; i ++ ) {
617620 var brk = rangebreaksIn [ i ] ;
@@ -622,55 +625,56 @@ module.exports = function setConvert(ax, fullLayout) {
622625 var op1 = op . charAt ( 1 ) ;
623626
624627 if ( brk . bounds ) {
625- var doesCrossPeriod = false ;
628+ var pattern = brk . pattern ;
629+ bnds = Lib . simpleMap ( brk . bounds , pattern ?
630+ cleanNumber :
631+ ax . d2c // case of pattern: ''
632+ ) ;
633+ b0 = bnds [ 0 ] ;
634+ b1 = bnds [ 1 ] ;
635+
636+ switch ( pattern ) {
637+ case WEEKDAY_PATTERN :
638+ vDate = new Date ( v ) ;
639+ vb = vDate . getUTCDay ( ) ;
640+
641+ if ( b0 > b1 ) {
642+ b1 += 7 ;
643+ if ( vb < b0 ) vb += 7 ;
644+ }
626645
627- switch ( brk . pattern ) {
628- case '%w' :
629- bnds = Lib . simpleMap ( brk . bounds , cleanNumber ) ;
630- b0 = bnds [ 0 ] ;
631- b1 = bnds [ 1 ] ;
632- vb = ( new Date ( v ) ) . getUTCDay ( ) ;
633- if ( bnds [ 0 ] > bnds [ 1 ] ) doesCrossPeriod = true ;
634646 break ;
635- case '%H' :
636- bnds = Lib . simpleMap ( brk . bounds , cleanNumber ) ;
637- b0 = bnds [ 0 ] ;
638- b1 = bnds [ 1 ] ;
639- var vDate = new Date ( v ) ;
640- vb = vDate . getUTCHours ( ) + (
641- vDate . getUTCMinutes ( ) * ONEMIN +
642- vDate . getUTCSeconds ( ) * ONESEC +
643- vDate . getUTCMilliseconds ( )
644- ) / ONEDAY ;
645- if ( bnds [ 0 ] > bnds [ 1 ] ) doesCrossPeriod = true ;
647+ case HOUR_PATTERN :
648+ vDate = new Date ( v ) ;
649+ var hours = vDate . getUTCHours ( ) ;
650+ var minutes = vDate . getUTCMinutes ( ) ;
651+ var seconds = vDate . getUTCSeconds ( ) ;
652+ var milliseconds = vDate . getUTCMilliseconds ( ) ;
653+
654+ vb = hours + (
655+ minutes / 60 +
656+ seconds / 3600 +
657+ milliseconds / 3600000
658+ ) ;
659+
660+ if ( b0 > b1 ) {
661+ b1 += 24 ;
662+ if ( vb < b0 ) vb += 24 ;
663+ }
664+
646665 break ;
647666 case '' :
648667 // N.B. should work on date axes as well!
649668 // e.g. { bounds: ['2020-01-04', '2020-01-05 23:59'] }
650- bnds = Lib . simpleMap ( brk . bounds , ax . d2c ) ;
651- if ( bnds [ 0 ] <= bnds [ 1 ] ) {
652- b0 = bnds [ 0 ] ;
653- b1 = bnds [ 1 ] ;
654- } else {
655- b0 = bnds [ 1 ] ;
656- b1 = bnds [ 0 ] ;
657- }
658669 // TODO should work with reversed-range axes
659670 vb = v ;
660671 break ;
661672 }
662673
663- if ( doesCrossPeriod ) {
664- if (
665- ( op0 === '(' ? vb > b0 : vb >= b0 ) ||
666- ( op1 === ')' ? vb < b1 : vb <= b1 )
667- ) return BADNUM ;
668- } else {
669- if (
670- ( op0 === '(' ? vb > b0 : vb >= b0 ) &&
671- ( op1 === ')' ? vb < b1 : vb <= b1 )
672- ) return BADNUM ;
673- }
674+ if (
675+ ( op0 === '(' ? vb > b0 : vb >= b0 ) &&
676+ ( op1 === ')' ? vb < b1 : vb <= b1 )
677+ ) return BADNUM ;
674678 } else {
675679 var vals = Lib . simpleMap ( brk . values , ax . d2c ) . sort ( Lib . sorterAsc ) ;
676680 var onOpenBound = false ;
@@ -699,8 +703,8 @@ module.exports = function setConvert(ax, fullLayout) {
699703 if ( ! ax . rangebreaks ) return rangebreaksOut ;
700704
701705 var rangebreaksIn = ax . rangebreaks . slice ( ) . sort ( function ( a , b ) {
702- if ( a . pattern === '%w' && b . pattern === '%H' ) return - 1 ;
703- else if ( b . pattern === '%w' && a . pattern === '%H' ) return 1 ;
706+ if ( a . pattern === WEEKDAY_PATTERN && b . pattern === HOUR_PATTERN ) return - 1 ;
707+ if ( b . pattern === WEEKDAY_PATTERN && a . pattern === HOUR_PATTERN ) return 1 ;
704708 return 0 ;
705709 } ) ;
706710
@@ -756,7 +760,7 @@ module.exports = function setConvert(ax, fullLayout) {
756760 var t ;
757761
758762 switch ( brk . pattern ) {
759- case '%w' :
763+ case WEEKDAY_PATTERN :
760764 b0 = bnds [ 0 ] + ( op0 === '(' ? 1 : 0 ) ;
761765 b1 = bnds [ 1 ] ;
762766 r0Pattern = r0Date . getUTCDay ( ) ;
@@ -771,7 +775,7 @@ module.exports = function setConvert(ax, fullLayout) {
771775 r0Date . getUTCSeconds ( ) * ONESEC -
772776 r0Date . getUTCMilliseconds ( ) ;
773777 break ;
774- case '%H' :
778+ case HOUR_PATTERN :
775779 b0 = bnds [ 0 ] ;
776780 b1 = bnds [ 1 ] ;
777781 r0Pattern = r0Date . getUTCHours ( ) ;
0 commit comments