Skip to content

Commit 77a271d

Browse files
authored
fix: rang-picker should not trigger on disabledDate by keyboard (#310)
* refactor: code style * fix: rang-picker should not trigger on disabledDate by keyboard
1 parent 13e10ec commit 77a271d

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

Diff for: examples/range.tsx

+18-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
2-
import moment, { Moment } from 'moment';
2+
import type { Moment } from 'moment';
3+
import moment from 'moment';
34
import RangePicker from '../src/RangePicker';
45
import momentGenerateConfig from '../src/generate/moment';
56
import zhCN from '../src/locale/zh_CN';
@@ -40,6 +41,11 @@ export default () => {
4041

4142
const rangePickerRef = React.useRef<RangePicker<Moment>>(null);
4243

44+
const now = momentGenerateConfig.getNow();
45+
const disabledDate = (current: Moment) => {
46+
return current.diff(now, 'days') > 1 || current.diff(now, 'days') < -1;
47+
};
48+
4349
return (
4450
<div>
4551
<h2>Value: {value ? `${formatDate(value[0])} ~ ${formatDate(value[1])}` : 'null'}</h2>
@@ -67,7 +73,7 @@ export default () => {
6773
ranges={{
6874
ranges: [moment(), moment().add(10, 'day')],
6975
}}
70-
onOk={dates => {
76+
onOk={(dates) => {
7177
console.log('OK!!!', dates);
7278
}}
7379
/>
@@ -162,6 +168,16 @@ export default () => {
162168
placeholder={['start...', 'end...']}
163169
/>
164170
</div>
171+
<div style={{ margin: '0 8px' }}>
172+
<h3>DisabledDate</h3>
173+
<RangePicker<Moment>
174+
{...sharedProps}
175+
value={undefined}
176+
locale={zhCN}
177+
placeholder={['start...', 'end...']}
178+
disabledDate={disabledDate}
179+
/>
180+
</div>
165181
</div>
166182
</div>
167183
);

Diff for: src/RangePicker.tsx

+9
Original file line numberDiff line numberDiff line change
@@ -603,6 +603,15 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
603603
triggerOpen(newOpen, index);
604604
},
605605
onSubmit: () => {
606+
if (
607+
// When user typing disabledDate with keyboard and enter, this value will be empty
608+
!selectedValue ||
609+
// Normal disabled check
610+
(disabledDate && disabledDate(selectedValue[index]))
611+
) {
612+
return false;
613+
}
614+
606615
triggerChange(selectedValue, index);
607616
resetText();
608617
},

Diff for: tests/range.spec.tsx

+25
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { act } from 'react-dom/test-utils';
44
import KeyCode from 'rc-util/lib/KeyCode';
55
import { spyElementPrototypes } from 'rc-util/lib/test/domHook';
66
import type { Moment } from 'moment';
7+
import moment from 'moment';
78
import type { Wrapper } from './util/commonUtil';
89
import { mount, getMoment, isSame, MomentRangePicker } from './util/commonUtil';
910
import zhCN from '../src/locale/zh_CN';
@@ -1544,4 +1545,28 @@ describe('Picker.Range', () => {
15441545
wrapper.simulate('mouseleave');
15451546
expect(handleMouseLeave).toHaveBeenCalled();
15461547
});
1548+
1549+
// https://github.com/ant-design/ant-design/issues/31334
1550+
it('keyboard should not trigger on disabledDate', () => {
1551+
const onCalendarChange = jest.fn();
1552+
const now = moment();
1553+
const disabledDate = (current: Moment) => {
1554+
return current.diff(now, 'days') > 1 || current.diff(now, 'days') < -1;
1555+
};
1556+
const wrapper = mount(
1557+
<MomentRangePicker onCalendarChange={onCalendarChange} disabledDate={disabledDate} />,
1558+
);
1559+
wrapper.find('input').first().simulate('focus');
1560+
wrapper.keyDown(KeyCode.ENTER);
1561+
wrapper.keyDown(KeyCode.TAB);
1562+
// Make sure the selected value is disabledDate. Because only a few values are disabledDate
1563+
wrapper.keyDown(KeyCode.DOWN);
1564+
wrapper.keyDown(KeyCode.DOWN);
1565+
wrapper.keyDown(KeyCode.DOWN);
1566+
wrapper.keyDown(KeyCode.DOWN);
1567+
wrapper.keyDown(KeyCode.DOWN);
1568+
wrapper.keyDown(KeyCode.DOWN);
1569+
wrapper.keyDown(KeyCode.ENTER);
1570+
expect(onCalendarChange).not.toHaveBeenCalled();
1571+
});
15471572
});

0 commit comments

Comments
 (0)