@@ -943,9 +943,9 @@ describe('Range', () => {
943943 /> ,
944944 ) ;
945945
946- // Cannot add between two disabled handles
947946 doMouseDown ( container , 40 , 'rc-slider' , true ) ;
948947 expect ( onChange ) . not . toHaveBeenCalled ( ) ;
948+ expect ( onDisabledChange ) . not . toHaveBeenCalled ( ) ;
949949
950950 // Can add when only one side is disabled
951951 rerender (
@@ -1016,5 +1016,70 @@ describe('Range', () => {
10161016 doMouseDown ( container , 90 , 'rc-slider' , true ) ;
10171017 expect ( onChange ) . toHaveBeenCalledWith ( [ 20 , 80 , 80 ] ) ;
10181018 } ) ;
1019+
1020+ it ( 'pushable respects disabled handle boundaries' , ( ) => {
1021+ const onChange = jest . fn ( ) ;
1022+ const { container } = render (
1023+ < Slider range defaultValue = { [ 20 , 40 , 60 , 80 ] } disabled = { [ false , true , false , false ] } pushable onChange = { onChange } /> ,
1024+ ) ;
1025+
1026+ // Push first handle right - should stop at disabled handle (40)
1027+ for ( let i = 0 ; i < 30 ; i ++ ) {
1028+ fireEvent . keyDown ( container . getElementsByClassName ( 'rc-slider-handle' ) [ 0 ] , { keyCode : keyCode . UP } ) ;
1029+ }
1030+
1031+ // First handle should not exceed 40 (position of disabled handle)
1032+ const lastCall = onChange . mock . calls [ onChange . mock . calls . length - 1 ] ;
1033+ expect ( lastCall [ 0 ] [ 0 ] ) . toBeLessThanOrEqual ( 40 ) ;
1034+ // Second handle is disabled at 40
1035+ expect ( lastCall [ 0 ] [ 1 ] ) . toBe ( 40 ) ;
1036+ } ) ;
1037+
1038+ it ( 'pushable revert respects disabled handles' , ( ) => {
1039+ const onChange = jest . fn ( ) ;
1040+ const { container } = render (
1041+ < Slider range defaultValue = { [ 10 , 20 , 90 , 100 ] } disabled = { [ false , true , false , false ] } pushable = { 5 } onChange = { onChange } /> ,
1042+ ) ;
1043+
1044+ // Move last handle left - should push third handle but stop at disabled
1045+ fireEvent . keyDown ( container . getElementsByClassName ( 'rc-slider-handle' ) [ 3 ] , { keyCode : keyCode . LEFT } ) ;
1046+
1047+ // Third handle should not go below disabled handle at 20
1048+ const lastCall = onChange . mock . calls [ onChange . mock . calls . length - 1 ] ;
1049+ expect ( lastCall [ 0 ] [ 2 ] ) . toBeGreaterThanOrEqual ( 20 ) ;
1050+ } ) ;
1051+
1052+ it ( 'keyboard home/end with disabled handles' , ( ) => {
1053+ const onChange = jest . fn ( ) ;
1054+ const { container } = render (
1055+ < Slider range defaultValue = { [ 20 , 50 , 80 ] } disabled = { [ true , false , true ] } onChange = { onChange } /> ,
1056+ ) ;
1057+
1058+ // HOME key on enabled middle handle - should go to left disabled handle boundary (20)
1059+ fireEvent . keyDown ( container . getElementsByClassName ( 'rc-slider-handle' ) [ 1 ] , { keyCode : keyCode . HOME } ) ;
1060+ expect ( onChange ) . toHaveBeenCalledWith ( [ 20 , 20 , 80 ] ) ;
1061+
1062+ onChange . mockClear ( ) ;
1063+
1064+ // END key on enabled middle handle - should go to right disabled handle boundary (80)
1065+ fireEvent . keyDown ( container . getElementsByClassName ( 'rc-slider-handle' ) [ 1 ] , { keyCode : keyCode . END } ) ;
1066+ expect ( onChange ) . toHaveBeenCalledWith ( [ 20 , 80 , 80 ] ) ;
1067+ } ) ;
1068+
1069+ it ( 'allowCross false with disabled handles' , ( ) => {
1070+ const onChange = jest . fn ( ) ;
1071+ const { container } = render (
1072+ < Slider range defaultValue = { [ 20 , 50 , 80 ] } disabled = { [ false , true , false ] } allowCross = { false } onChange = { onChange } /> ,
1073+ ) ;
1074+
1075+ // Try to move first handle past disabled middle handle
1076+ for ( let i = 0 ; i < 50 ; i ++ ) {
1077+ fireEvent . keyDown ( container . getElementsByClassName ( 'rc-slider-handle' ) [ 0 ] , { keyCode : keyCode . RIGHT } ) ;
1078+ }
1079+
1080+ // First handle should not cross disabled handle at 50
1081+ const lastCall = onChange . mock . calls [ onChange . mock . calls . length - 1 ] ;
1082+ expect ( lastCall [ 0 ] [ 0 ] ) . toBeLessThanOrEqual ( 50 ) ;
1083+ } ) ;
10191084 } ) ;
10201085} ) ;
0 commit comments