@@ -4,75 +4,112 @@ import { getValue } from '../utils/miscUtil';
44import { GenerateConfig } from '../generate' ;
55import { isSameDate , getQuarter } from '../utils/dateUtil' ;
66
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+ ) {
2226 const startDate = getValue ( selectedValue , 0 ) ;
2327 const endDate = getValue ( selectedValue , 1 ) ;
2428
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+
2547 const disabledStartDate = React . useCallback (
2648 ( date : DateType ) => {
2749 if ( disabledDate && disabledDate ( date ) ) {
2850 return true ;
2951 }
3052
53+ // Disabled range
3154 if ( disabled [ 1 ] && endDate ) {
3255 return ! isSameDate ( generateConfig , date , endDate ) && generateConfig . isAfter ( date , endDate ) ;
3356 }
3457
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+
3574 return false ;
3675 } ,
37- [ disabledDate , disabled [ 1 ] , endDate ] ,
76+ [ disabledDate , disabled [ 1 ] , endDate , disabledStart ] ,
3877 ) ;
3978
40- const disableEndDate = React . useCallback (
79+ const disabledEndDate = React . useCallback (
4180 ( date : DateType ) => {
4281 if ( disabledDate && disabledDate ( date ) ) {
4382 return true ;
4483 }
4584
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 ) {
6787 return (
68- ! isSameDate ( generateConfig , date , startDate ) && generateConfig . isAfter ( startDate , date )
88+ ! isSameDate ( generateConfig , date , endDate ) && generateConfig . isAfter ( startDate , date )
6989 ) ;
7090 }
7191
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+
72109 return false ;
73110 } ,
74- [ disabledDate , startDate , picker ] ,
111+ [ disabledDate , disabled [ 0 ] , startDate , disabledEnd ] ,
75112 ) ;
76113
77- return [ disabledStartDate , disableEndDate ] ;
114+ return [ disabledStartDate , disabledEndDate ] ;
78115}
0 commit comments