Skip to content

Commit 3cfedd8

Browse files
Ivan KitanovIvan Kitanov
authored andcommitted
Adding minor improvements to stories, visibleMonths setter and tests
2 parents c1b1451 + 0bfc951 commit 3cfedd8

File tree

3 files changed

+111
-21
lines changed

3 files changed

+111
-21
lines changed

src/components/calendar/helpers.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,16 +93,14 @@ export function convertToDateRange(
9393

9494
if (isString(value)) {
9595
const obj = JSON.parse(value);
96-
if (obj.start && obj.end) {
97-
return {
98-
start: isValidDate(new Date(obj.start)),
99-
end: isValidDate(new Date(obj.end)),
100-
};
101-
}
102-
} else {
103-
return value;
96+
const start = isValidDate(new Date(obj.start));
97+
const end = isValidDate(new Date(obj.end));
98+
return {
99+
start: start ? CalendarDay.from(start).native : null,
100+
end: end ? CalendarDay.from(end).native : null,
101+
};
104102
}
105-
return null;
103+
return value;
106104
}
107105

108106
/**

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

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,7 @@ describe('Date range picker', () => {
717717

718718
dateTimeInputs[1].focus();
719719
// first arrow sets today, second sets aMonthAgo
720+
dateTimeInputs[1].setSelectionRange(0, 1); // make sure caret is on the month part (MM/dd/yyyy)
720721
simulateKeyboard(dateTimeInputs[1], arrowDown);
721722
simulateKeyboard(dateTimeInputs[1], arrowDown);
722723
await elementUpdated(picker);
@@ -1259,14 +1260,99 @@ describe('Date range picker', () => {
12591260
simulateKeyboard(dateTimeInputs[0], arrowUp);
12601261
await elementUpdated(picker);
12611262

1262-
expect(eventSpy).calledWith('igcInput');
1263+
expect(eventSpy).calledWith('igcInput', {
1264+
detail: { start: today.native, end: null },
1265+
});
12631266
eventSpy.resetHistory();
12641267

1268+
dateTimeInputs[0].setSelectionRange(0, 1); // make sure caret is on the month part (MM/dd/yyyy)
12651269
simulateKeyboard(dateTimeInputs[0], arrowDown);
12661270
await elementUpdated(picker);
1271+
1272+
expect(eventSpy).calledWith('igcInput', {
1273+
detail: { start: today.add('month', -1).native, end: null },
1274+
});
1275+
eventSpy.resetHistory();
1276+
1277+
dateTimeInputs[0].blur();
1278+
expect(eventSpy).calledWith('igcChange', {
1279+
detail: { start: today.add('month', -1).native, end: null },
1280+
});
12671281
});
12681282

1269-
it('should set the calendar active date to the start of the range while typing', async () => {});
1283+
it('should set the calendar active date to the altered date of the range while typing', async () => {
1284+
const eventSpy = spy(picker, 'emitEvent');
1285+
const aMonthAgo = today.add('month', -1);
1286+
const twoMonthsAgo = today.add('month', -2);
1287+
picker.value = null;
1288+
picker.open = true;
1289+
await elementUpdated(picker);
1290+
1291+
dateTimeInputs[0].focus();
1292+
expect(isFocused(dateTimeInputs[0])).to.be.true;
1293+
1294+
dateTimeInputs[0].setSelectionRange(0, 1); // make sure caret is on the month part (MM/dd/yyyy)
1295+
simulateKeyboard(dateTimeInputs[0], arrowDown);
1296+
await elementUpdated(picker);
1297+
1298+
expect(eventSpy).calledWith('igcInput');
1299+
eventSpy.resetHistory();
1300+
checkDatesEqual(dateTimeInputs[0].value!, today.native);
1301+
// typing a single date does not select a range in the calendar
1302+
checkSelectedRange(picker, { start: null, end: null });
1303+
checkDatesEqual(calendar.activeDate, today.native);
1304+
1305+
dateTimeInputs[1].focus();
1306+
expect(isFocused(dateTimeInputs[1])).to.be.true;
1307+
1308+
dateTimeInputs[1].setSelectionRange(0, 1);
1309+
simulateKeyboard(dateTimeInputs[1], arrowDown);
1310+
await elementUpdated(picker);
1311+
1312+
expect(eventSpy).calledWith('igcInput');
1313+
eventSpy.resetHistory();
1314+
checkDatesEqual(dateTimeInputs[1].value!, today.native);
1315+
// typing the end date as well results in a selected range of a single date
1316+
checkSelectedRange(picker, { start: today.native, end: today.native });
1317+
checkDatesEqual(calendar.activeDate, today.native);
1318+
1319+
simulateKeyboard(dateTimeInputs[1], arrowDown);
1320+
await elementUpdated(picker);
1321+
1322+
expect(eventSpy).calledWith('igcInput');
1323+
eventSpy.resetHistory();
1324+
checkDatesEqual(dateTimeInputs[1].value!, aMonthAgo.native);
1325+
// changing the end date while typing alters the selected range
1326+
// the active date is set to the typed date, in this case the end one
1327+
checkSelectedRange(picker, {
1328+
start: today.native,
1329+
end: aMonthAgo.native,
1330+
});
1331+
checkDatesEqual(calendar.activeDate, aMonthAgo.native);
1332+
1333+
// on losing focus of the end input, the dates are swapped since end is earlier than start
1334+
dateTimeInputs[0].focus();
1335+
expect(isFocused(dateTimeInputs[0])).to.be.true;
1336+
await elementUpdated(picker);
1337+
1338+
checkSelectedRange(picker, {
1339+
start: aMonthAgo.native,
1340+
end: today.native,
1341+
});
1342+
checkDatesEqual(calendar.activeDate, aMonthAgo.native);
1343+
1344+
dateTimeInputs[0].setSelectionRange(0, 1);
1345+
simulateKeyboard(dateTimeInputs[0], arrowDown);
1346+
await elementUpdated(picker);
1347+
1348+
expect(eventSpy).calledWith('igcInput');
1349+
checkDatesEqual(dateTimeInputs[0].value!, twoMonthsAgo.native);
1350+
checkSelectedRange(picker, {
1351+
start: twoMonthsAgo.native,
1352+
end: today.native,
1353+
});
1354+
checkDatesEqual(calendar.activeDate, twoMonthsAgo.native);
1355+
});
12701356
});
12711357
});
12721358
describe('Slots', () => {

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

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,11 @@ export default class IgcDateRangePickerComponent extends FormAssociatedRequiredM
317317
}
318318

319319
public get value(): DateRangeValue | null {
320-
if (!this._formValue.value) {
321-
return { start: null, end: null }; // TODO what should the default value be? null?
322-
}
323-
324-
return this._formValue.value;
320+
// TODO what should the default value be? null?
321+
return {
322+
start: this._formValue?.value?.start ?? null,
323+
end: this._formValue?.value?.end ?? null,
324+
};
325325
}
326326
/**
327327
* Renders chips with custom ranges based on the elements of the array.
@@ -671,7 +671,8 @@ export default class IgcDateRangePickerComponent extends FormAssociatedRequiredM
671671
event.preventDefault();
672672
return;
673673
}
674-
const newValue = (event.target as IgcDateTimeInputComponent).value;
674+
const input = event.target as IgcDateTimeInputComponent;
675+
const newValue = input.value ? CalendarDay.from(input.value).native : null;
675676

676677
if (event.target === this._inputs[0]) {
677678
this._startDate = newValue;
@@ -687,7 +688,10 @@ export default class IgcDateRangePickerComponent extends FormAssociatedRequiredM
687688
protected handleInputChangeEvent(event: CustomEvent<Date | null>) {
688689
event.stopPropagation();
689690
this._swapDatesFlag = false;
690-
const newValue = (event.target as IgcDateTimeInputComponent).value;
691+
692+
const input = event.target as IgcDateTimeInputComponent;
693+
const newValue = input.value ? CalendarDay.from(input.value).native : null;
694+
691695
if (event.target === this._inputs[0]) {
692696
this._startDate = newValue;
693697
} else {
@@ -876,21 +880,22 @@ export default class IgcDateRangePickerComponent extends FormAssociatedRequiredM
876880

877881
const calendarDayStart = toCalendarDay(this._startDate);
878882
const calendarDayEnd = toCalendarDay(this._endDate);
883+
const isStartEarlierThanEnd = calendarDayStart.lessThan(calendarDayEnd);
879884

880885
// dates should not be swapped while typing
881-
if (!this._swapDatesFlag && calendarDayStart.greaterThan(calendarDayEnd)) {
886+
if (!this._swapDatesFlag && !isStartEarlierThanEnd) {
882887
this.swapDates();
883888
}
884889
if (!calendarDayStart.equalTo(calendarDayEnd)) {
885890
const range = Array.from(
886891
calendarRange({ start: this._startDate, end: this._endDate })
887892
);
888-
range.push(last(range).add('day', 1));
893+
// calendarRange is non-inclusive
894+
range.push(last(range).add('day', isStartEarlierThanEnd ? 1 : -1));
889895
this._calendar.values = range.map((d) => d.native);
890896
} else {
891897
this._calendar.values = [this._startDate];
892898
}
893-
this._calendar.activeDate = this._startDate ?? this._calendar.activeDate;
894899
}
895900

896901
private swapDates() {
@@ -916,6 +921,7 @@ export default class IgcDateRangePickerComponent extends FormAssociatedRequiredM
916921

917922
private _select(value: DateRangeValue | null, emitEvent = false) {
918923
this.value = value;
924+
this._calendar.activeDate = this._startDate ?? this._calendar.activeDate;
919925
if (emitEvent) {
920926
this.emitEvent('igcChange', { detail: this.value });
921927
}

0 commit comments

Comments
 (0)