1
1
import { computed , ref , watchEffect } from 'vue' ;
2
+ import { PanelType , PickerType } from '../type' ;
2
3
import {
3
4
getValidDate ,
4
5
isValidDate ,
@@ -8,18 +9,19 @@ import {
8
9
startOfMonth ,
9
10
startOfYear ,
10
11
} from '../util/date' ;
12
+ import { defineVueComponent , keys , withDefault } from '../vueUtil' ;
11
13
import { TableDate } from './TableDate' ;
12
14
import { TableMonth } from './TableMonth' ;
13
15
import { TableYear } from './TableYear' ;
14
- import { PanelType , PickerType } from '../type' ;
15
- import { defineVueComponent , keys , withDefault } from '../vueUtil' ;
16
16
17
17
export interface CalendarProps {
18
18
type ?: PickerType ;
19
19
value ?: Date | Date [ ] ;
20
20
defaultValue ?: Date ;
21
21
defaultPanel ?: PickerType ;
22
22
disabledDate ?: ( value : Date , innerValue ?: Date [ ] ) => boolean ;
23
+ holidayClickable ?: boolean ;
24
+ holidayDate ?: ( value : Date , innerValue ?: Date [ ] ) => boolean ;
23
25
getClasses ?: ( value : Date , innerValue : Date [ ] , classes : string ) => string [ ] | string ;
24
26
calendar ?: Date ;
25
27
multiple ?: boolean ;
@@ -40,6 +42,8 @@ function Calendar(originalProps: CalendarProps) {
40
42
defaultValue : startOfDay ( new Date ( ) ) ,
41
43
type : 'date' as PickerType ,
42
44
disabledDate : ( ) => false ,
45
+ holidayClickable : ( ) => false ,
46
+ holidayDate : ( ) => false ,
43
47
getClasses : ( ) => [ ] ,
44
48
titleFormat : 'YYYY-MM-DD' ,
45
49
} ) ;
@@ -85,8 +89,22 @@ function Calendar(originalProps: CalendarProps) {
85
89
return props . disabledDate ( new Date ( date ) , innerValue . value ) ;
86
90
} ;
87
91
92
+ const isHoliday = ( date : Date ) => {
93
+ return props . holidayDate ( new Date ( date ) , innerValue . value ) ;
94
+ } ;
95
+
96
+ const isClickable = ( date : Date ) => {
97
+ if ( isDisabled ( date ) ) {
98
+ return false ;
99
+ }
100
+ if ( ! props . holidayClickable && isHoliday ( date ) ) {
101
+ return false ;
102
+ }
103
+ return true ;
104
+ } ;
105
+
88
106
const emitDate = ( date : Date , type : string ) => {
89
- if ( ! isDisabled ( date ) ) {
107
+ if ( isClickable ( date ) ) {
90
108
props . onPick ?.( date ) ;
91
109
if ( props . multiple === true ) {
92
110
const nextDates = innerValue . value . filter ( ( v ) => v . getTime ( ) !== date . getTime ( ) ) ;
@@ -133,6 +151,8 @@ function Calendar(originalProps: CalendarProps) {
133
151
const getCellClasses = ( cellDate : Date , classes : string [ ] = [ ] ) => {
134
152
if ( isDisabled ( cellDate ) ) {
135
153
classes . push ( 'disabled' ) ;
154
+ } else if ( isHoliday ( cellDate ) ) {
155
+ classes . push ( 'holiday' ) ;
136
156
} else if ( innerValue . value . some ( ( v ) => v . getTime ( ) === cellDate . getTime ( ) ) ) {
137
157
classes . push ( 'active' ) ;
138
158
}
@@ -222,6 +242,8 @@ export const calendarProps = keys<CalendarProps>()([
222
242
'defaultValue' ,
223
243
'defaultPanel' ,
224
244
'disabledDate' ,
245
+ 'holidayDate' ,
246
+ 'holidayClickable' ,
225
247
'getClasses' ,
226
248
'calendar' ,
227
249
'multiple' ,
0 commit comments