Skip to content

Commit a9b14a6

Browse files
authored
fix: Start can not after end (#95)
* fix: Start can not after end * more test case
1 parent 90f03a5 commit a9b14a6

File tree

2 files changed

+67
-27
lines changed

2 files changed

+67
-27
lines changed

src/RangePicker.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
387387

388388
function triggerChange(newValue: RangeValue<DateType>, sourceIndex: 0 | 1) {
389389
let values = newValue;
390-
const startValue = getValue(values, 0);
390+
let startValue = getValue(values, 0);
391391
let endValue = getValue(values, 1);
392392

393393
// >>>>> Format start & end values
@@ -404,11 +404,18 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
404404
!isSameDate(generateConfig, startValue, endValue))
405405
) {
406406
// Clean up end date when start date is after end date
407-
values = [startValue, null];
408-
endValue = null;
407+
if (sourceIndex === 0) {
408+
values = [startValue, null];
409+
endValue = null;
410+
} else {
411+
startValue = null;
412+
values = [null, endValue];
413+
}
409414

410415
// Clean up cache since invalidate
411-
openRecordsRef.current = {};
416+
openRecordsRef.current = {
417+
[sourceIndex]: true,
418+
};
412419
} else if (picker !== 'time' || order !== false) {
413420
// Reorder when in same date
414421
values = reorderValues(values, generateConfig);
@@ -954,7 +961,6 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
954961

955962
if (type === 'submit' || (type !== 'key' && !needConfirmButton)) {
956963
// triggerChange will also update selected values
957-
// triggerChangeOld(values);
958964
triggerChange(values, mergedActivePickerIndex);
959965
} else {
960966
setSelectedValue(values);

tests/range.spec.tsx

Lines changed: 56 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,19 +1247,36 @@ describe('Picker.Range', () => {
12471247
expect(wrapper.isOpen()).toBeFalsy();
12481248
});
12491249

1250-
it('valued: start -> end -> close', () => {
1251-
const wrapper = mount(
1252-
<MomentRangePicker defaultValue={[getMoment('1989-01-01'), getMoment('1990-01-01')]} />,
1253-
);
1250+
describe('valued: start -> end -> close', () => {
1251+
it('in range', () => {
1252+
const wrapper = mount(
1253+
<MomentRangePicker defaultValue={[getMoment('1989-01-01'), getMoment('1990-01-01')]} />,
1254+
);
12541255

1255-
wrapper.openPicker(0);
1256-
wrapper.inputValue('1990-11-28');
1257-
wrapper.closePicker(0);
1258-
expect(wrapper.isOpen()).toBeTruthy();
1256+
wrapper.openPicker(0);
1257+
wrapper.inputValue('1990-11-28');
1258+
wrapper.closePicker(0);
1259+
expect(wrapper.isOpen()).toBeTruthy();
12591260

1260-
wrapper.inputValue('1990-12-23');
1261-
wrapper.closePicker(1);
1262-
expect(wrapper.isOpen()).toBeFalsy();
1261+
wrapper.inputValue('1990-12-23');
1262+
wrapper.closePicker(1);
1263+
expect(wrapper.isOpen()).toBeFalsy();
1264+
});
1265+
1266+
it('new start is after end', () => {
1267+
const wrapper = mount(
1268+
<MomentRangePicker defaultValue={[getMoment('1989-01-10'), getMoment('1989-01-15')]} />,
1269+
);
1270+
1271+
wrapper.openPicker(0);
1272+
wrapper.inputValue('1989-01-20');
1273+
wrapper.closePicker(0);
1274+
expect(wrapper.isOpen()).toBeTruthy();
1275+
1276+
wrapper.inputValue('1989-01-25');
1277+
wrapper.closePicker(1);
1278+
expect(wrapper.isOpen()).toBeFalsy();
1279+
});
12631280
});
12641281

12651282
it('empty: end -> start -> close', () => {
@@ -1275,19 +1292,36 @@ describe('Picker.Range', () => {
12751292
expect(wrapper.isOpen()).toBeFalsy();
12761293
});
12771294

1278-
it('valued: end -> start -> close', () => {
1279-
const wrapper = mount(
1280-
<MomentRangePicker defaultValue={[getMoment('1989-01-01'), getMoment('1990-01-01')]} />,
1281-
);
1295+
describe('valued: end -> start -> close', () => {
1296+
it('in range', () => {
1297+
const wrapper = mount(
1298+
<MomentRangePicker defaultValue={[getMoment('1989-01-01'), getMoment('1990-01-01')]} />,
1299+
);
12821300

1283-
wrapper.openPicker(1);
1284-
wrapper.inputValue('1990-11-28', 1);
1285-
wrapper.closePicker(1);
1286-
expect(wrapper.isOpen()).toBeTruthy();
1301+
wrapper.openPicker(1);
1302+
wrapper.inputValue('1990-11-28', 1);
1303+
wrapper.closePicker(1);
1304+
expect(wrapper.isOpen()).toBeTruthy();
12871305

1288-
wrapper.inputValue('1989-01-01');
1289-
wrapper.closePicker(0);
1290-
expect(wrapper.isOpen()).toBeFalsy();
1306+
wrapper.inputValue('1989-01-01');
1307+
wrapper.closePicker(0);
1308+
expect(wrapper.isOpen()).toBeFalsy();
1309+
});
1310+
1311+
it('new end is before start', () => {
1312+
const wrapper = mount(
1313+
<MomentRangePicker defaultValue={[getMoment('1989-01-10'), getMoment('1989-01-15')]} />,
1314+
);
1315+
1316+
wrapper.openPicker(1);
1317+
wrapper.inputValue('1989-01-07', 1);
1318+
wrapper.closePicker(1);
1319+
expect(wrapper.isOpen()).toBeTruthy();
1320+
1321+
wrapper.inputValue('1989-01-01');
1322+
wrapper.closePicker(0);
1323+
expect(wrapper.isOpen()).toBeFalsy();
1324+
});
12911325
});
12921326

12931327
it('not change: start not to end', () => {

0 commit comments

Comments
 (0)