Skip to content

Commit dbdec7b

Browse files
authored
Merge pull request #1146 from spider-hand/patch-1
fix: disable months if the selected year is out of range
2 parents e8491b3 + 5f2e73c commit dbdec7b

File tree

5 files changed

+50
-2
lines changed

5 files changed

+50
-2
lines changed

src/VueDatePicker/components/MonthPicker/month-picker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
isDateBetween,
1111
isMonthAllowed,
1212
isMonthDisabled,
13+
isOutOfYearRange,
1314
resetDate,
1415
setDateMonthOrYear,
1516
} from '@/utils/date-utils';
@@ -138,7 +139,8 @@ export const useMonthPicker = (props: PickerBasePropsType, emit: VueEmit) => {
138139
) ||
139140
isMonthDisabled(propDates.value.disabledDates, year.value(instance), month.value) ||
140141
defaultedFilters.value.months?.includes(month.value) ||
141-
!isMonthAllowed(propDates.value.allowedDates, year.value(instance), month.value);
142+
!isMonthAllowed(propDates.value.allowedDates, year.value(instance), month.value) ||
143+
isOutOfYearRange(props.yearRange, year.value(instance));
142144
const isBetween = isMonthBetween(month.value, instance);
143145
const highlighted = checkHighlightMonth(defaultedHighlight.value, month.value, year.value(instance));
144146
return { active, disabled, isBetween, highlighted };

src/VueDatePicker/composables/validation.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
isDateAfter,
99
isDateBefore,
1010
isDateEqual,
11+
isOutOfYearRange,
1112
resetDate,
1213
setTimeValue,
1314
} from '@/utils/date-utils';
@@ -54,7 +55,7 @@ export const useValidation = (props: PickerBasePropsType | AllPropsType) => {
5455

5556
const dateYear = getYear(date);
5657

57-
const outOfYearRange = dateYear < +props.yearRange[0] || dateYear > +props.yearRange[1];
58+
const outOfYearRange = isOutOfYearRange(props.yearRange, dateYear);
5859

5960
return !(
6061
aboveMax ||

src/VueDatePicker/utils/date-utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,3 +455,7 @@ export const getBeforeAndAfterInRange = (range: number, date: Date) => {
455455
const after = addDays(resetDateTime(date), range);
456456
return { before, after };
457457
};
458+
459+
export const isOutOfYearRange = (yearRange: number[], year: number) => {
460+
return year < +yearRange[0] || year > +yearRange[1];
461+
};

tests/unit/components/MonthYearPicker.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,34 @@ describe('Month and Year picker components', () => {
166166
expect(disabledValue).toHaveProperty('disabled', true);
167167
});
168168

169+
it('Should disable months based on the year range', async () => {
170+
const currentYear = getYear(new Date());
171+
const previousYear = currentYear - 1;
172+
const wrapper = mount(MonthPicker, {
173+
props: { ...props, year: currentYear, yearRange: [currentYear, currentYear], monthPicker: true },
174+
}) as unknown as MonthPickerCmp<{
175+
handleYearSelect: (selectedYear: number, i: number) => void;
176+
groupedMonths: (i: number) => OverlayGridItem[][];
177+
}>;
178+
179+
const monthValues = wrapper.vm.groupedMonths(0);
180+
monthValues.forEach((row) => {
181+
row.forEach((month) => {
182+
expect(month.disabled).toBeFalsy();
183+
});
184+
});
185+
186+
wrapper.vm.handleYearSelect(previousYear, 0);
187+
await nextTick();
188+
189+
const updatedMonthValues = wrapper.vm.groupedMonths(0);
190+
updatedMonthValues.forEach((row) => {
191+
row.forEach((month) => {
192+
expect(month.disabled).toBeTruthy();
193+
});
194+
});
195+
});
196+
169197
it('Should render multi-calendars in month picker mode', async () => {
170198
const wrapper = mount(MonthPicker, { props: { ...props, multiCalendars: true } }) as unknown as MonthPickerCmp<{
171199
year: (inst: number) => number;

tests/unit/utils.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import {
3939
isDateAfter,
4040
isDateBefore,
4141
isDateBetween,
42+
isOutOfYearRange,
4243
isValidDate,
4344
parseFreeInput,
4445
resetDate,
@@ -492,4 +493,16 @@ describe('Utils and date utils formatting', () => {
492493
expect((mappedDatesInTimezone.allowedDates as Map<string, any>).get(getMapKey(todayInTz))).toEqual(todayInTz);
493494
expect(mappedDatesInTimezone.highlight).toEqual(highlightFn);
494495
});
496+
497+
it('Should check if the year is out of range', () => {
498+
const yearRange = [2020, 2025];
499+
const yearInRange = 2023;
500+
const yearOutOfRange = 2019;
501+
502+
expect(isOutOfYearRange(yearRange, yearInRange)).toBeFalsy();
503+
expect(isOutOfYearRange(yearRange, yearOutOfRange)).toBeTruthy();
504+
505+
const emptyRange: number[] = [];
506+
expect(isOutOfYearRange(emptyRange, yearInRange)).toBeFalsy();
507+
});
495508
});

0 commit comments

Comments
 (0)