Skip to content

Commit 07dbc62

Browse files
committed
fix: the month and year cannot be switched after the datepicker is rendered in Calendar
1 parent 66b486d commit 07dbc62

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

src/PickerPanel.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
216216
},
217217
});
218218

219+
const originalValue = React.useRef(value);
220+
219221
const setViewDate = (date: DateType) => {
220222
setInnerViewDate(date);
221223
if (onPickerValueChange) {
@@ -334,8 +336,9 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
334336

335337
// ============================ Effect ============================
336338
React.useEffect(() => {
337-
if (value && !initRef.current) {
339+
if (value && !isEqual(generateConfig, value, originalValue.current) && !initRef.current) {
338340
setInnerViewDate(value);
341+
originalValue.current = value;
339342
}
340343
}, [value]);
341344

tests/panel.spec.tsx

+36
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,13 @@ import zhCN from '../src/locale/zh_CN';
88
import {
99
clickButton,
1010
confirmOK,
11+
findCell,
1112
getMoment,
13+
isOpen,
1214
isSame,
1315
MomentPickerPanel,
1416
selectCell,
17+
Calendar
1518
} from './util/commonUtil';
1619

1720
jest.mock('../src/utils/uiUtil', () => {
@@ -557,4 +560,37 @@ describe('Picker.Panel', () => {
557560
});
558561
});
559562
});
563+
564+
it('calendar', () => {
565+
const { container } = render(<Calendar />);
566+
expect(container.querySelector('.rc-picker-month-panel')).toBeTruthy();
567+
const inputElements: any = container.querySelectorAll('.rc-picker-month-panel input');
568+
expect(inputElements.length).toBe(12);
569+
const inputElement = inputElements[0];
570+
expect(inputElement.value).toBe("");
571+
572+
fireEvent.mouseDown(inputElement);
573+
fireEvent.focus(inputElement);
574+
expect(isOpen()).toBeTruthy();
575+
const monthDOM = document.querySelector('.rc-picker-header-view > .rc-picker-month-btn') as HTMLElement;
576+
const lastMonthBtnValue = monthDOM.innerHTML;
577+
fireEvent.click(document.querySelector('.rc-picker-dropdown .rc-picker-header-prev-btn'));
578+
const currentMonthBtnValue = monthDOM.innerHTML;
579+
expect(lastMonthBtnValue !== currentMonthBtnValue).toBeTruthy();
580+
581+
const cell = findCell(2, 1);
582+
fireEvent.click(cell);
583+
jest.runAllTimers();
584+
expect(inputElement.value).not.toBeNull();
585+
expect(isOpen()).toBeFalsy();
586+
587+
fireEvent.mouseDown(inputElement);
588+
fireEvent.focus(inputElement);
589+
expect(isOpen()).toBeTruthy();
590+
const monthDOMNew = document.querySelector('.rc-picker-header-view > .rc-picker-month-btn') as HTMLElement;
591+
const lastMonthBtnValueNew = monthDOMNew.innerHTML;
592+
fireEvent.click(document.querySelector('.rc-picker-dropdown .rc-picker-header-prev-btn'));
593+
const currentMonthBtnValueNew = monthDOMNew.innerHTML;
594+
expect(lastMonthBtnValueNew !== currentMonthBtnValueNew).toBeTruthy();
595+
});
560596
});

tests/util/commonUtil.tsx

+27-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22
// import { mount as originMount, ReactWrapper } from 'enzyme';
33
import { fireEvent } from '@testing-library/react';
44
import moment, { Moment, unitOfTime } from 'moment';
55
import Picker, { PickerPanel, PickerProps } from '../../src';
66
import momentGenerateConfig from '../../src/generate/moment';
77
import enUS from '../../src/locale/en_US';
8+
import zhCN from '../../src/locale/zh_CN';
89
import { PickerBaseProps, PickerDateProps, PickerTimeProps } from '../../src/Picker';
910
import {
1011
PickerPanelBaseProps,
@@ -95,6 +96,31 @@ export const MomentPickerPanel = (props: MomentPickerPanelProps) => (
9596
<PickerPanel<Moment> generateConfig={momentGenerateConfig} locale={enUS} {...props} />
9697
);
9798

99+
export const Calendar = () => {
100+
const [date, setDate] = useState<Moment | null>(null);
101+
return (
102+
<PickerPanel<Moment>
103+
locale={zhCN}
104+
mode="month"
105+
generateConfig={momentGenerateConfig}
106+
monthCellRender={(value) => {
107+
return (
108+
<Picker<Moment>
109+
locale={zhCN}
110+
generateConfig={momentGenerateConfig}
111+
value={date ? moment(date) : null}
112+
onChange={(dateValue) => {
113+
setDate(dateValue);
114+
}}
115+
/>
116+
)
117+
}}
118+
dateRender={() => null}
119+
hideHeader
120+
/>
121+
)
122+
}
123+
98124
// Moment Range Picker
99125
export type MomentRangePickerProps =
100126
| InjectDefaultProps<RangePickerBaseProps<Moment>>

0 commit comments

Comments
 (0)