Skip to content

Commit bff5be8

Browse files
authored
fix: PickerPanel controlled not sync internal pickerValue (#750)
* fix: pickerValue controlled * test: add test case
1 parent f7f9faa commit bff5be8

File tree

3 files changed

+22
-187
lines changed

3 files changed

+22
-187
lines changed

docs/examples/debug.tsx

Lines changed: 9 additions & 186 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ MyInput.displayName = 'MyInput';
127127
export default () => {
128128
const singleRef = React.useRef<PickerRef>(null);
129129

130-
const [value, setValue] = React.useState<Dayjs>(null);
130+
const [value, setValue] = React.useState<Dayjs>(dayjs('2024-01-15'));
131131
const [rangeValue, setRangeValue] = React.useState<[Dayjs, Dayjs]>(
132-
[dayjs('2024-01-15'), dayjs('2024-02-01')],
132+
[dayjs('2024-01-15'), dayjs('2024-03-01')],
133133
// null,
134134
// undefined,
135135
);
@@ -138,103 +138,16 @@ export default () => {
138138
setValue(nextVal);
139139
};
140140

141+
React.useEffect(() => {
142+
setTimeout(() => {
143+
setValue(dayjs('2024-03-03'));
144+
}, 2000);
145+
}, []);
146+
141147
return (
142148
<div>
143-
{/* <Origin7Range /> */}
144-
<input defaultValue="2030-03-0" />
145-
<input defaultValue="2030-03-01 11:22:3" />
146-
147-
<br />
148-
149-
<SinglePicker
150-
// Shared
151-
{...sharedLocale}
152-
// disabledDate={(date) => date.isBefore(dayjs())}
153-
// disabledTime={() => ({
154-
// disabledHours: () => [0, 1, 2, 3, 4, 5],
155-
// disabledMinutes: () => [0, 1, 2, 3, 4, 5],
156-
// disabledSeconds: () => [0, 1, 2, 3, 4, 5],
157-
// })}
158-
defaultOpenValue={dayjs()}
159-
// open
160-
picker="time"
161-
format={{
162-
format: 'HH:mm:ss.SSS A',
163-
type: 'mask',
164-
}}
165-
// showTime={{
166-
// defaultValue: dayjs(),
167-
// }}
168-
ref={singleRef}
169-
suffixIcon="🧶"
170-
// showTime={{
171-
// disabledTime: () => ({
172-
// disabledHours: () => [0, 1, 2, 3, 4, 5],
173-
// disabledMinutes: () => [0, 1, 2, 3, 4, 5],
174-
// disabledSeconds: () => [0, 1, 2, 3, 4, 5],
175-
// }),
176-
// }}
177-
// showTime={{}}
178-
// disabled
179-
open
180-
onChange={(...args) => {
181-
console.log('🔥 Change:', ...args);
182-
}}
183-
onCalendarChange={(...args) => {
184-
console.log('🎉 Calendar Change:', ...args);
185-
}}
186-
onPickerValueChange={(val, info) => {
187-
console.log('👻 Picker Value Change:', val, val?.format('YYYY-MM-DD'), info);
188-
}}
189-
onPanelChange={(val, info) => {
190-
console.log('🎼 Panel Change:', val, val?.format('YYYY-MM-DD'), info);
191-
}}
192-
style={{ width: 300 }}
193-
onKeyDown={(e) => {
194-
console.log('🎬 KeyDown:', e);
195-
}}
196-
/>
197-
<br />
198-
<RangePicker
199-
{...sharedLocale}
200-
// value={rangeValue}
201-
// open
202-
showTime={{
203-
defaultOpenValue: [dayjs()],
204-
}}
205-
panelRender={(ori) => <>2333{ori}</>}
206-
onChange={(val, text) => {
207-
console.log('🔥 Change:', val, text);
208-
setRangeValue(val);
209-
}}
210-
onCalendarChange={(val, text, info) => {
211-
console.log('🎉 Calendar Change:', val, text, info);
212-
}}
213-
onOpenChange={(nextOpen) => {
214-
console.log('🏆 Next Open:', nextOpen);
215-
}}
216-
onPickerValueChange={(val, info) => {
217-
console.log(
218-
'👻 Picker Value Change:',
219-
val,
220-
val?.[0]?.format('YYYY-MM-DD'),
221-
val?.[1]?.format('YYYY-MM-DD'),
222-
info,
223-
);
224-
}}
225-
/>
226-
<br />
227-
228-
<button
229-
onClick={() => {
230-
singleRef.current?.focus();
231-
}}
232-
>
233-
Focus
234-
</button>
235-
236149
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 16 }}>
237-
{/* <PickerPanel
150+
<PickerPanel
238151
generateConfig={dayjsGenerateConfig}
239152
locale={zhCN}
240153
value={value}
@@ -243,97 +156,7 @@ export default () => {
243156
console.error('1');
244157
console.log('🎲 PanelValue Change:', panelValue, mode);
245158
}}
246-
/> */}
247-
{/* <CellPicker
248-
picker="time"
249-
locale={{
250-
...zhCN,
251-
cellMeridiemFormat: 'A',
252-
}}
253-
components={{
254-
time: MyTime,
255-
}}
256-
showTime={{
257-
format: 'HH:mm:ss',
258-
use12Hours: true,
259-
// showTitle: true,
260-
// defaultValue: dayjs('2000-01-01 01:03:05.800'),
261-
}}
262-
pickerValue={dayjs('2000-01-01 01:03:05.800')}
263-
/> */}
264-
{/* <CellPicker
265-
picker="date"
266-
// showTime={{
267-
// format: 'HH:mm:ss.SSS A',
268-
// showTitle: true,
269-
// }}
270-
/> */}
271-
{/* <CellPicker
272-
picker="week"
273-
/> */}
274-
275-
{/* <CellPicker
276-
defaultValue={dayjs().add(1, 'day')}
277-
disabledDate={(date) => date.date() === 11}
278-
// cellRender={(date: Dayjs, info) => {
279-
// if (info.type === 'date') {
280-
// return date.format('Do');
281-
// }
282-
// }}
283-
value={value}
284-
onChange={setValue}
285159
/>
286-
287-
<CellPicker
288-
picker="week"
289-
defaultValue={dayjs('2000-01-01')}
290-
disabledDate={(date) => date.week() === 3}
291-
/>
292-
293-
<CellPicker
294-
picker="month"
295-
defaultValue={dayjs('2000-01-01')}
296-
disabledDate={(date) => date.week() === 3}
297-
value={value}
298-
onChange={setValue}
299-
/>
300-
301-
<CellPicker
302-
picker="year"
303-
defaultValue={dayjs('2023-04-05')}
304-
disabledDate={(date) => date.week() === 3}
305-
/>
306-
307-
<CellPicker
308-
picker="decade"
309-
defaultValue={dayjs('2023-04-05')}
310-
disabledDate={(date) => date.week() === 3}
311-
/>
312-
313-
<CellPicker
314-
picker="time"
315-
defaultValue={dayjs('1990-10-23 13:05:08.200')}
316-
disabledDate={(date) => date.week() === 3}
317-
showTime={{
318-
format: 'HH:mm:ss.SSS',
319-
// format: 'LTS',
320-
use12Hours: true,
321-
changeOnScroll: true,
322-
disabledHours: () => [0, 1, 2, 3, 4, 5],
323-
disabledMinutes: (hour) => (hour === 6 ? [0, 1, 2, 4, 5, 6] : []),
324-
disabledSeconds: (_, minute) => (minute === 3 ? [6, 7, 8, 9] : []),
325-
disabledTime: () => ({
326-
disabledMilliseconds: () => [0, 100],
327-
}),
328-
showTitle: true,
329-
millisecondStep: 20,
330-
}}
331-
// cellRender={(val: number, info) => {
332-
// if (info.type === 'time') {
333-
// return `${val}!!!`;
334-
// }
335-
// }}
336-
/> */}
337160
</div>
338161
</div>
339162
);

src/PickerPanel/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,12 @@ function PickerPanel<DateType extends object = any>(
275275
},
276276
);
277277

278+
React.useEffect(() => {
279+
if (mergedValue[0] && !pickerValue) {
280+
setInternalPickerValue(mergedValue[0]);
281+
}
282+
}, [mergedValue[0]]);
283+
278284
// Both trigger when manually pickerValue or mode change
279285
const triggerPanelChange = (viewDate?: DateType, nextMode?: PanelMode) => {
280286
onPanelChange?.(viewDate || pickerValue, nextMode || mergedMode);

tests/panel.spec.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ describe('Picker.Panel', () => {
5757
rerender(<DayPickerPanel value={getDay('2000-01-23')} onChange={onChange} />);
5858
selectCell(23);
5959
expect(onChange).not.toHaveBeenCalled();
60+
61+
// Should switch pickerValue of panel
62+
rerender(<DayPickerPanel value={getDay('2020-03-03')} onChange={onChange} />);
63+
selectCell(13);
64+
expect(isSame(onChange.mock.calls[0][0], '2020-03-13')).toBeTruthy();
6065
});
6166

6267
it('uncontrolled', () => {
@@ -517,7 +522,7 @@ describe('Picker.Panel', () => {
517522
case 'month':
518523
case 'quarter':
519524
case 'week':
520-
return (current as Dayjs).get(picker as any);
525+
return (current as Dayjs).get(picker as any) as any;
521526
}
522527
};
523528

@@ -709,4 +714,5 @@ describe('Picker.Panel', () => {
709714

710715
expect(container.querySelector('.rc-picker-header-view').textContent).toEqual('01:02:03 AM');
711716
});
717+
712718
});

0 commit comments

Comments
 (0)