@@ -17,9 +17,10 @@ import {
1717 subMonths ,
1818} from 'date-fns' ;
1919
20- import { ICalendarDay , IMarker , InternalModuleValue , UseCalendar , VueEmit } from '../../interfaces' ;
20+ import { ICalendarDay , IMarker , InternalModuleValue , UseCalendar , VueEmit , WeekStartNum } from '../../interfaces' ;
2121import {
2222 getNextMonthYear ,
23+ getWeekFromDate ,
2324 isDateAfter ,
2425 isDateBefore ,
2526 isDateBetween ,
@@ -396,6 +397,12 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
396397 return [ ] ;
397398 } ;
398399
400+ const autoApply = ( ) : void => {
401+ if ( props . autoApply ) {
402+ emit ( 'autoApply' ) ;
403+ }
404+ } ;
405+
399406 /**
400407 * Called when the date in the calendar is clicked
401408 * Do a necessary formatting and assign value to internal
@@ -407,6 +414,10 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
407414 if ( ! day . current && props . hideOffsetDates ) {
408415 return ;
409416 }
417+ if ( props . weekPicker ) {
418+ modelValue . value = getWeekFromDate ( new Date ( day . value ) , + props . weekStart as WeekStartNum ) ;
419+ return autoApply ( ) ;
420+ }
410421 if ( ! props . range && ! isNumberArray ( hours . value ) && ! isNumberArray ( minutes . value ) ) {
411422 const date = setDateTime ( new Date ( day . value ) , hours . value , minutes . value , getSecondsValue ( ) ) ;
412423 if ( props . multiDates ) {
@@ -415,9 +426,7 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
415426 modelValue . value = date ;
416427 }
417428 updateFlow ( ) ;
418- if ( props . autoApply ) {
419- emit ( 'autoApply' ) ;
420- }
429+ autoApply ( ) ;
421430 } else if ( isNumberArray ( hours . value ) && isNumberArray ( minutes . value ) && ! props . multiDates ) {
422431 let rangeDate = modelValue . value ? ( modelValue . value as Date [ ] ) . slice ( ) : [ ] ;
423432 if ( rangeDate . length === 2 && ! ( props . fixedStart || props . fixedEnd ) ) {
@@ -480,11 +489,14 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
480489 * Check if range ends on the given day
481490 */
482491 const isHoverRangeEnd = ( day : UnwrapRef < ICalendarDay > ) : boolean => {
483- if ( props . autoRange ) {
492+ if ( props . autoRange || props . weekPicker ) {
484493 if ( hoveredDate . value ) {
485494 if ( props . hideOffsetDates && ! day . current ) return false ;
486495 const rangeEnd = addDays ( hoveredDate . value , + props . autoRange ) ;
487- return isDateEqual ( rangeEnd , new Date ( day . value ) ) ;
496+ const range = getWeekFromDate ( new Date ( hoveredDate . value ) , + props . weekStart as WeekStartNum ) ;
497+ return props . weekPicker
498+ ? isDateEqual ( range [ 1 ] , new Date ( day . value ) )
499+ : isDateEqual ( rangeEnd , new Date ( day . value ) ) ;
488500 }
489501 return false ;
490502 }
@@ -495,22 +507,26 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
495507 * Check if date in auto range preview is in between
496508 */
497509 const isAutoRangeInBetween = ( day : UnwrapRef < ICalendarDay > ) : boolean => {
498- if ( props . autoRange ) {
510+ if ( props . autoRange || props . weekPicker ) {
499511 if ( hoveredDate . value ) {
500512 const rangeEnd = addDays ( hoveredDate . value , + props . autoRange ) ;
501513 if ( props . hideOffsetDates && ! day . current ) return false ;
502- return isDateAfter ( day . value , hoveredDate . value ) && isDateBefore ( day . value , rangeEnd ) ;
514+ const range = getWeekFromDate ( new Date ( hoveredDate . value ) , + props . weekStart as WeekStartNum ) ;
515+ return props . weekPicker
516+ ? isDateAfter ( day . value , range [ 0 ] ) && isDateBefore ( day . value , range [ 1 ] )
517+ : isDateAfter ( day . value , hoveredDate . value ) && isDateBefore ( day . value , rangeEnd ) ;
503518 }
504519 return false ;
505520 }
506521 return false ;
507522 } ;
508523
509524 const isAutoRangeStart = ( day : UnwrapRef < ICalendarDay > ) : boolean => {
510- if ( props . autoRange ) {
525+ if ( props . autoRange || props . weekPicker ) {
511526 if ( hoveredDate . value ) {
512527 if ( props . hideOffsetDates && ! day . current ) return false ;
513- return isDateEqual ( hoveredDate . value , day . value ) ;
528+ const range = getWeekFromDate ( new Date ( hoveredDate . value ) , + props . weekStart as WeekStartNum ) ;
529+ return props . weekPicker ? isDateEqual ( range [ 0 ] , day . value ) : isDateEqual ( hoveredDate . value , day . value ) ;
514530 }
515531 return false ;
516532 }
@@ -659,7 +675,7 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
659675 * Check when to add a proper active start/end date class on range picker
660676 */
661677 const rangeActiveStartEnd = ( day : UnwrapRef < ICalendarDay > , isStart = true ) : boolean => {
662- if ( props . range && isRange ( modelValue . value ) ) {
678+ if ( ( props . range || props . weekPicker ) && isRange ( modelValue . value ) ) {
663679 if ( props . hideOffsetDates && ! day . current ) return false ;
664680 return isDateEqual ( new Date ( day . value ) , modelValue . value [ isStart ? 0 : 1 ] ) ;
665681 } else if ( props . range ) {
@@ -687,7 +703,7 @@ export const useCalendar = (props: UseCalendar, emit: VueEmit, updateFlow: () =>
687703 } ;
688704
689705 const isHoverDate = ( disabled : boolean , calendarDay : ICalendarDay ) => {
690- return Array . isArray ( props . internalModelValue ) && props . internalModelValue . length
706+ return ( Array . isArray ( props . internalModelValue ) && props . internalModelValue . length ) || props . weekPicker
691707 ? false
692708 : ! disabled &&
693709 ! isActiveDate ( calendarDay ) &&
0 commit comments