@@ -4,75 +4,112 @@ import { getValue } from '../utils/miscUtil';
4
4
import { GenerateConfig } from '../generate' ;
5
5
import { isSameDate , getQuarter } from '../utils/dateUtil' ;
6
6
7
- export default function useRangeDisabled < DateType > ( {
8
- picker,
9
- locale,
10
- selectedValue,
11
- disabledDate,
12
- disabled,
13
- generateConfig,
14
- } : {
15
- picker : PickerMode ;
16
- selectedValue : RangeValue < DateType > ;
17
- disabledDate ?: ( date : DateType ) => boolean ;
18
- disabled : [ boolean , boolean ] ;
19
- locale : Locale ;
20
- generateConfig : GenerateConfig < DateType > ;
21
- } ) {
7
+ export default function useRangeDisabled < DateType > (
8
+ {
9
+ picker,
10
+ locale,
11
+ selectedValue,
12
+ disabledDate,
13
+ disabled,
14
+ generateConfig,
15
+ } : {
16
+ picker : PickerMode ;
17
+ selectedValue : RangeValue < DateType > ;
18
+ disabledDate ?: ( date : DateType ) => boolean ;
19
+ disabled : [ boolean , boolean ] ;
20
+ locale : Locale ;
21
+ generateConfig : GenerateConfig < DateType > ;
22
+ } ,
23
+ disabledStart : boolean ,
24
+ disabledEnd : boolean ,
25
+ ) {
22
26
const startDate = getValue ( selectedValue , 0 ) ;
23
27
const endDate = getValue ( selectedValue , 1 ) ;
24
28
29
+ function weekNumber ( date : DateType ) {
30
+ const year = generateConfig . getYear ( date ) ;
31
+ const week = generateConfig . locale . getWeek ( locale . locale , date ) ;
32
+ return year * 100 + week ;
33
+ }
34
+
35
+ function monthNumber ( date : DateType ) {
36
+ const year = generateConfig . getYear ( date ) ;
37
+ const month = generateConfig . getMonth ( date ) ;
38
+ return year * 100 + month ;
39
+ }
40
+
41
+ function quarterNumber ( date : DateType ) {
42
+ const year = generateConfig . getYear ( date ) ;
43
+ const quarter = getQuarter ( generateConfig , date ) ;
44
+ return year * 10 + quarter ;
45
+ }
46
+
25
47
const disabledStartDate = React . useCallback (
26
48
( date : DateType ) => {
27
49
if ( disabledDate && disabledDate ( date ) ) {
28
50
return true ;
29
51
}
30
52
53
+ // Disabled range
31
54
if ( disabled [ 1 ] && endDate ) {
32
55
return ! isSameDate ( generateConfig , date , endDate ) && generateConfig . isAfter ( date , endDate ) ;
33
56
}
34
57
58
+ // Disabled part
59
+ if ( disabledStart && endDate ) {
60
+ switch ( picker ) {
61
+ case 'quarter' :
62
+ return quarterNumber ( date ) > quarterNumber ( endDate ) ;
63
+ case 'month' :
64
+ return monthNumber ( date ) > monthNumber ( endDate ) ;
65
+ case 'week' :
66
+ return weekNumber ( date ) > weekNumber ( endDate ) ;
67
+ default :
68
+ return (
69
+ ! isSameDate ( generateConfig , date , endDate ) && generateConfig . isAfter ( date , endDate )
70
+ ) ;
71
+ }
72
+ }
73
+
35
74
return false ;
36
75
} ,
37
- [ disabledDate , disabled [ 1 ] , endDate ] ,
76
+ [ disabledDate , disabled [ 1 ] , endDate , disabledStart ] ,
38
77
) ;
39
78
40
- const disableEndDate = React . useCallback (
79
+ const disabledEndDate = React . useCallback (
41
80
( date : DateType ) => {
42
81
if ( disabledDate && disabledDate ( date ) ) {
43
82
return true ;
44
83
}
45
84
46
- if ( startDate ) {
47
- if ( picker === 'week' ) {
48
- const startYear = generateConfig . getYear ( startDate ) ;
49
- const dateYear = generateConfig . getYear ( date ) ;
50
- const startWeek = generateConfig . locale . getWeek ( locale . locale , startDate ) ;
51
- const dateWeek = generateConfig . locale . getWeek ( locale . locale , date ) ;
52
- const startVal = startYear * 100 + startWeek ;
53
- const dateVal = dateYear * 100 + dateWeek ;
54
- return dateVal < startVal ;
55
- }
56
-
57
- if ( picker === 'quarter' ) {
58
- const startYear = generateConfig . getYear ( startDate ) ;
59
- const dateYear = generateConfig . getYear ( date ) ;
60
- const startQuarter = getQuarter ( generateConfig , startDate ) ;
61
- const dateQuarter = getQuarter ( generateConfig , date ) ;
62
- const startVal = startYear * 10 + startQuarter ;
63
- const dateVal = dateYear * 10 + dateQuarter ;
64
- return dateVal < startVal ;
65
- }
66
-
85
+ // Disabled range
86
+ if ( disabled [ 0 ] && startDate ) {
67
87
return (
68
- ! isSameDate ( generateConfig , date , startDate ) && generateConfig . isAfter ( startDate , date )
88
+ ! isSameDate ( generateConfig , date , endDate ) && generateConfig . isAfter ( startDate , date )
69
89
) ;
70
90
}
71
91
92
+ // Disabled part
93
+ if ( disabledEnd && startDate ) {
94
+ switch ( picker ) {
95
+ case 'quarter' :
96
+ return quarterNumber ( date ) < quarterNumber ( startDate ) ;
97
+ case 'month' :
98
+ return monthNumber ( date ) < monthNumber ( startDate ) ;
99
+ case 'week' :
100
+ return weekNumber ( date ) < weekNumber ( startDate ) ;
101
+ default :
102
+ return (
103
+ ! isSameDate ( generateConfig , date , startDate ) &&
104
+ generateConfig . isAfter ( startDate , date )
105
+ ) ;
106
+ }
107
+ }
108
+
72
109
return false ;
73
110
} ,
74
- [ disabledDate , startDate , picker ] ,
111
+ [ disabledDate , disabled [ 0 ] , startDate , disabledEnd ] ,
75
112
) ;
76
113
77
- return [ disabledStartDate , disableEndDate ] ;
114
+ return [ disabledStartDate , disabledEndDate ] ;
78
115
}
0 commit comments