@@ -8,13 +8,15 @@ import {
88 isDateAfter ,
99 isDateBefore ,
1010 isDateEqual ,
11+ resetDate ,
1112 setTimeValue ,
1213} from '@/utils/date-utils' ;
1314import { useDefaults } from '@/composables/defaults' ;
1415import { convertType , getMapDate } from '@/utils/util' ;
1516
1617import type { InternalModuleValue , DisabledTimesFn , DisabledTime , TimeModel , MaybeDate } from '@/interfaces' ;
1718import type { PickerBasePropsType , AllPropsType } from '@/props' ;
19+ import { computed } from 'vue' ;
1820
1921export const useValidation = ( props : PickerBasePropsType | AllPropsType ) => {
2022 const { defaultedFilters, defaultedRange, propDates } = useDefaults ( props ) ;
@@ -125,14 +127,16 @@ export const useValidation = (props: PickerBasePropsType | AllPropsType) => {
125127 return true ;
126128 } ;
127129
128- // If min or max range is set, validate given range
129- const checkMinMaxRange = ( secondDate : Date , modelValue : InternalModuleValue , index = 0 ) : boolean => {
130- if (
131- Array . isArray ( modelValue ) &&
130+ const shouldCheckMinMaxRange = ( modelValue : InternalModuleValue , index : number ) : modelValue is Array < Date > => {
131+ return ( Array . isArray ( modelValue ) &&
132132 modelValue [ index ] &&
133133 ( defaultedRange . value . maxRange || defaultedRange . value . minRange ) &&
134- isValidYear ( modelValue [ index ] )
135- ) {
134+ isValidYear ( modelValue [ index ] ) ) as boolean ;
135+ } ;
136+
137+ // If min or max range is set, validate given range
138+ const checkMinMaxRange = ( secondDate : Date , modelValue : InternalModuleValue , index = 0 ) : boolean => {
139+ if ( shouldCheckMinMaxRange ( modelValue , index ) ) {
136140 const absoluteDiff = differenceInCalendarDays ( secondDate , modelValue [ index ] ) ;
137141 const daysInBetween = getDaysInBetween ( modelValue [ index ] , secondDate ) ;
138142 const disabledDates =
@@ -241,12 +245,54 @@ export const useValidation = (props: PickerBasePropsType | AllPropsType) => {
241245 return checkDisabledTimes ( date , isValid ) ;
242246 } ;
243247
248+ const isMonthWithinRange = ( date : Date | string ) : boolean => {
249+ if ( ! props . monthPicker ) return true ;
250+ let valid = true ;
251+ const dateToCompare = getDate ( resetDate ( date ) ) ;
252+ if ( propDates . value . minDate && propDates . value . maxDate ) {
253+ const minDate = getDate ( resetDate ( propDates . value . minDate ) ) ;
254+ const maxDate = getDate ( resetDate ( propDates . value . maxDate ) ) ;
255+ return (
256+ ( isDateAfter ( dateToCompare , minDate ) && isDateBefore ( dateToCompare , maxDate ) ) ||
257+ isDateEqual ( dateToCompare , minDate ) ||
258+ isDateEqual ( dateToCompare , maxDate )
259+ ) ;
260+ }
261+ if ( propDates . value . minDate ) {
262+ const minDate = getDate ( resetDate ( propDates . value . minDate ) ) ;
263+
264+ valid = isDateAfter ( dateToCompare , minDate ) || isDateEqual ( dateToCompare , minDate ) ;
265+ }
266+ if ( propDates . value . maxDate ) {
267+ const maxDate = getDate ( resetDate ( propDates . value . maxDate ) ) ;
268+ valid = isDateBefore ( dateToCompare , maxDate ) || isDateEqual ( dateToCompare , maxDate ) ;
269+ }
270+
271+ return valid ;
272+ } ;
273+
274+ const isTimeValid = computed ( ( ) => ( internalModelValue : InternalModuleValue ) : boolean => {
275+ if ( ! props . enableTimePicker || props . ignoreTimeValidation ) return true ;
276+ return isValidTime ( internalModelValue ) ;
277+ } ) ;
278+
279+ const isMonthValid = computed ( ( ) => ( internalModelValue : InternalModuleValue ) : boolean => {
280+ if ( ! props . monthPicker ) return true ;
281+ if ( defaultedRange . value . enabled && Array . isArray ( internalModelValue ) ) {
282+ const invalid = internalModelValue . filter ( ( value ) => ! isMonthWithinRange ( value ) ) ;
283+ return ! invalid . length ;
284+ }
285+ return isMonthWithinRange ( internalModelValue as Date ) ;
286+ } ) ;
287+
244288 return {
245289 isDisabled,
246290 validateDate,
247291 validateMonthYearInRange,
248292 isDateRangeAllowed,
249293 checkMinMaxRange,
250294 isValidTime,
295+ isTimeValid,
296+ isMonthValid,
251297 } ;
252298} ;
0 commit comments