@@ -27,9 +27,12 @@ var ONEHOUR = numConstants.ONEHOUR;
27
27
var ONEMIN = numConstants . ONEMIN ;
28
28
var ONESEC = numConstants . ONESEC ;
29
29
30
- var constants = require ( './constants' ) ;
31
30
var axisIds = require ( './axis_ids' ) ;
32
31
32
+ var constants = require ( './constants' ) ;
33
+ var HOUR_PATTERN = constants . HOUR_PATTERN ;
34
+ var WEEKDAY_PATTERN = constants . WEEKDAY_PATTERN ;
35
+
33
36
function fromLog ( v ) {
34
37
return Math . pow ( 10 , v ) ;
35
38
}
@@ -611,7 +614,7 @@ module.exports = function setConvert(ax, fullLayout) {
611
614
612
615
ax . maskBreaks = function ( v ) {
613
616
var rangebreaksIn = ax . rangebreaks || [ ] ;
614
- var bnds , b0 , b1 , vb ;
617
+ var bnds , b0 , b1 , vb , vDate ;
615
618
616
619
for ( var i = 0 ; i < rangebreaksIn . length ; i ++ ) {
617
620
var brk = rangebreaksIn [ i ] ;
@@ -622,55 +625,56 @@ module.exports = function setConvert(ax, fullLayout) {
622
625
var op1 = op . charAt ( 1 ) ;
623
626
624
627
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
+ }
626
645
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 ;
634
646
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
+
646
665
break ;
647
666
case '' :
648
667
// N.B. should work on date axes as well!
649
668
// 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
- }
658
669
// TODO should work with reversed-range axes
659
670
vb = v ;
660
671
break ;
661
672
}
662
673
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 ;
674
678
} else {
675
679
var vals = Lib . simpleMap ( brk . values , ax . d2c ) . sort ( Lib . sorterAsc ) ;
676
680
var onOpenBound = false ;
@@ -699,8 +703,8 @@ module.exports = function setConvert(ax, fullLayout) {
699
703
if ( ! ax . rangebreaks ) return rangebreaksOut ;
700
704
701
705
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 ;
704
708
return 0 ;
705
709
} ) ;
706
710
@@ -756,7 +760,7 @@ module.exports = function setConvert(ax, fullLayout) {
756
760
var t ;
757
761
758
762
switch ( brk . pattern ) {
759
- case '%w' :
763
+ case WEEKDAY_PATTERN :
760
764
b0 = bnds [ 0 ] + ( op0 === '(' ? 1 : 0 ) ;
761
765
b1 = bnds [ 1 ] ;
762
766
r0Pattern = r0Date . getUTCDay ( ) ;
@@ -771,7 +775,7 @@ module.exports = function setConvert(ax, fullLayout) {
771
775
r0Date . getUTCSeconds ( ) * ONESEC -
772
776
r0Date . getUTCMilliseconds ( ) ;
773
777
break ;
774
- case '%H' :
778
+ case HOUR_PATTERN :
775
779
b0 = bnds [ 0 ] ;
776
780
b1 = bnds [ 1 ] ;
777
781
r0Pattern = r0Date . getUTCHours ( ) ;
0 commit comments