Skip to content

Commit 898fb45

Browse files
committed
fix(validators): test two edge cases for disabled dates + isValid method fix and refactor
1 parent a8a3b6d commit 898fb45

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

src/components/date-range-picker/date-range-picker.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2073,6 +2073,24 @@ describe('Date range picker', () => {
20732073
expect(spec.element.invalid).to.be.true;
20742074
spec.assertSubmitFails();
20752075
await checkInputsInvalidState(spec.element, true, true);
2076+
2077+
// single selected date outside the disabled range
2078+
spec.setProperties({
2079+
disabledDates,
2080+
value: { start: new Date(2025, 0, 20), end: new Date(2025, 0, 20) },
2081+
});
2082+
expect(spec.element.invalid).to.be.false;
2083+
spec.assertSubmitPasses();
2084+
await checkInputsInvalidState(spec.element, false, false);
2085+
2086+
// single selected date in the disabled range
2087+
spec.setProperties({
2088+
disabledDates,
2089+
value: { start: new Date(2025, 1, 20), end: new Date(2025, 1, 20) },
2090+
});
2091+
expect(spec.element.invalid).to.be.true;
2092+
spec.assertSubmitFails();
2093+
await checkInputsInvalidState(spec.element, true, true);
20762094
});
20772095

20782096
it('should enforce custom constraint', async () => {

src/components/date-range-picker/date-range-picker.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ import IgcInputComponent from '../input/input.js';
6262
import IgcPopoverComponent from '../popover/popover.js';
6363
import IgcValidationContainerComponent from '../validation-container/validation-container.js';
6464
import { styles } from './date-range-picker.base.css.js';
65-
import { dateRangePickerValidators } from './validators.js';
65+
import { dateRangeValidators } from './validators.js';
6666

6767
export interface DateRangeValue {
6868
start: Date | null;
@@ -197,7 +197,7 @@ export default class IgcDateRangePickerComponent extends FormAssociatedRequiredM
197197
protected inputId = `date-range-picker-${IgcDateRangePickerComponent.increment()}`;
198198

199199
protected override get __validators() {
200-
return dateRangePickerValidators;
200+
return dateRangeValidators;
201201
}
202202

203203
/* blazorSuppress */

src/components/date-range-picker/validators.ts

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,33 @@ export const badInputDateRangeValidator: Validator<{
6868
key: 'badInput',
6969
message: ({ value }) => formatString(messages.disabledDate, value),
7070
isValid: ({ value, disabledDates }) => {
71-
if (value?.start && value?.end && disabledDates) {
72-
const range = Array.from(
73-
calendarRange({ start: value.start, end: value.end })
74-
);
75-
range.push(last(range).add('day', 1));
76-
const rangeIncludingDisabled = range.some((day) =>
77-
isDateInRanges(day, disabledDates)
78-
);
79-
return !rangeIncludingDisabled;
71+
if (!value?.start || !value?.end || !disabledDates) {
72+
return true;
73+
}
74+
75+
let range = [];
76+
if (value.start.getTime() === value.end.getTime()) {
77+
range = [value.start];
78+
} else {
79+
range = Array.from(calendarRange({ start: value.start, end: value.end }));
80+
const lastDay = last(range);
81+
if (lastDay) {
82+
range.push(lastDay.add('day', 1));
83+
}
84+
}
85+
86+
for (let i = 0; i < range.length; i++) {
87+
if (isDateInRanges(range[i], disabledDates)) {
88+
return false;
89+
}
8090
}
8191
return true;
8292
},
8393
};
8494

85-
export const dateRangePickerValidators: Validator<IgcDateRangePickerComponent>[] =
86-
[
87-
requiredDateRangeValidator,
88-
minDateRangeValidator,
89-
maxDateRangeValidator,
90-
badInputDateRangeValidator,
91-
];
95+
export const dateRangeValidators: Validator<IgcDateRangePickerComponent>[] = [
96+
requiredDateRangeValidator,
97+
minDateRangeValidator,
98+
maxDateRangeValidator,
99+
badInputDateRangeValidator,
100+
];

0 commit comments

Comments
 (0)