@@ -2,7 +2,7 @@ import { useParams, useNavigate, useLocation } from 'react-router-dom';
2
2
import { getCollection , getMatch } from '../../common/api/collectionsApi' ;
3
3
import { usePageTitle } from '../layout/layoutSlice' ;
4
4
import styles from './Collections.module.scss' ;
5
- import { useEffect , useMemo , useRef , useState } from 'react' ;
5
+ import { useCallback , useEffect , useMemo , useRef , useState } from 'react' ;
6
6
import { DataProduct } from './DataProduct' ;
7
7
import {
8
8
countDecimals ,
@@ -608,6 +608,7 @@ const DateRangeFilterControls = ({
608
608
} = useForm ( {
609
609
defaultValues : { min : defMin , max : defMax } ,
610
610
reValidateMode : 'onChange' ,
611
+ shouldFocusError : false ,
611
612
} ) ;
612
613
const values = getValues ( ) ;
613
614
const { error : minError } = getFieldState ( 'min' , formState ) ;
@@ -643,6 +644,18 @@ const DateRangeFilterControls = ({
643
644
}
644
645
} ) ;
645
646
647
+ const validateMin = useCallback (
648
+ ( value : string , max : string ) =>
649
+ parseDate ( value ) <= parseDate ( max ) && ! Number . isNaN ( parseDate ( value ) ) ,
650
+ [ ]
651
+ ) ;
652
+
653
+ const validateMax = useCallback (
654
+ ( value : string , min : string ) =>
655
+ parseDate ( value ) >= parseDate ( min ) && ! Number . isNaN ( parseDate ( value ) ) ,
656
+ [ ]
657
+ ) ;
658
+
646
659
const submit = handleSubmit ( ( ) => {
647
660
setFilterRange ( 0 ) ( ) ;
648
661
} ) ;
@@ -656,9 +669,13 @@ const DateRangeFilterControls = ({
656
669
} ) ;
657
670
658
671
useEffect ( ( ) => {
659
- //Set slider position from values
660
- setSliderPosition ( [ values . min , values . max ] ) ;
661
- } , [ values . min , values . max ] ) ;
672
+ //Set slider position from values, if valid
673
+ if (
674
+ validateMin ( values . min , values . max ) &&
675
+ validateMax ( values . max , values . min )
676
+ )
677
+ setSliderPosition ( [ values . min , values . max ] ) ;
678
+ } , [ values . min , values . max , validateMin , validateMax ] ) ;
662
679
663
680
const [ filterMin , filterMax ] = [ filter . min_value , filter . max_value ] ;
664
681
useEffect ( ( ) => {
@@ -676,7 +693,7 @@ const DateRangeFilterControls = ({
676
693
< TextField
677
694
{ ...register ( 'min' , {
678
695
valueAsDate : true ,
679
- validate : ( value ) => parseDate ( value ) < parseDate ( values . max ) ,
696
+ validate : ( value ) => validateMin ( value , values . max ) ,
680
697
onBlur : submit ,
681
698
onChange : debounceSubmit ,
682
699
} ) }
@@ -687,7 +704,7 @@ const DateRangeFilterControls = ({
687
704
< TextField
688
705
{ ...register ( 'max' , {
689
706
valueAsDate : true ,
690
- validate : ( value ) => parseDate ( value ) > parseDate ( values . min ) ,
707
+ validate : ( value ) => validateMax ( value , values . min ) ,
691
708
onBlur : submit ,
692
709
onChange : debounceSubmit ,
693
710
} ) }
@@ -749,6 +766,7 @@ const RangeFilterControls = ({
749
766
} = useForm ( {
750
767
defaultValues : { min : defMin , max : defMax } ,
751
768
reValidateMode : 'onChange' ,
769
+ shouldFocusError : false ,
752
770
} ) ;
753
771
const values = getValues ( ) ;
754
772
const { error : minError } = getFieldState ( 'min' , formState ) ;
@@ -784,6 +802,22 @@ const RangeFilterControls = ({
784
802
}
785
803
} ) ;
786
804
805
+ const validateMin = useCallback (
806
+ ( value : number , max : number ) =>
807
+ value <= max &&
808
+ ( filter . type === 'float' || Number . isInteger ( value ) ) &&
809
+ ! Number . isNaN ( value ) ,
810
+ [ filter . type ]
811
+ ) ;
812
+
813
+ const validateMax = useCallback (
814
+ ( value : number , min : number ) =>
815
+ value >= min &&
816
+ ( filter . type === 'float' || Number . isInteger ( value ) ) &&
817
+ ! Number . isNaN ( value ) ,
818
+ [ filter . type ]
819
+ ) ;
820
+
787
821
const submit = handleSubmit ( ( ) => {
788
822
setFilterRange ( 0 ) ( ) ;
789
823
} ) ;
@@ -797,9 +831,13 @@ const RangeFilterControls = ({
797
831
} ) ;
798
832
799
833
useEffect ( ( ) => {
800
- //Set slider position from values
801
- setSliderPosition ( [ values . min , values . max ] ) ;
802
- } , [ values . min , values . max ] ) ;
834
+ //Set slider position from values, if valid
835
+ if (
836
+ validateMin ( values . min , values . max ) &&
837
+ validateMax ( values . max , values . min )
838
+ )
839
+ setSliderPosition ( [ values . min , values . max ] ) ;
840
+ } , [ values . min , values . max , validateMin , validateMax ] ) ;
803
841
804
842
const [ filterMin , filterMax ] = [ filter . min_value , filter . max_value ] ;
805
843
useEffect ( ( ) => {
@@ -824,9 +862,7 @@ const RangeFilterControls = ({
824
862
< TextField
825
863
{ ...register ( 'min' , {
826
864
valueAsNumber : true ,
827
- validate : ( value ) =>
828
- value < values . max &&
829
- ( filter . type === 'float' || Number . isInteger ( value ) ) ,
865
+ validate : ( value ) => validateMin ( value , values . max ) ,
830
866
onChange : debounceSubmit ,
831
867
onBlur : submit ,
832
868
} ) }
@@ -837,9 +873,7 @@ const RangeFilterControls = ({
837
873
< TextField
838
874
{ ...register ( 'max' , {
839
875
valueAsNumber : true ,
840
- validate : ( value ) =>
841
- value > values . min &&
842
- ( filter . type === 'float' || Number . isInteger ( value ) ) ,
876
+ validate : ( value ) => validateMax ( value , values . min ) ,
843
877
onChange : debounceSubmit ,
844
878
onBlur : submit ,
845
879
} ) }
0 commit comments