Skip to content

Commit b5224d3

Browse files
authored
enhance: opt picker time panel hover to show as placeholder (#858)
* enhance: hover time to show placeholder * test: add test case * test: coverage
1 parent 8ea9dbd commit b5224d3

File tree

3 files changed

+114
-13
lines changed

3 files changed

+114
-13
lines changed

src/PickerPanel/TimePanel/TimePanelBody/TimeColumn.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,14 @@ export interface TimeUnitColumnProps {
1818
optionalValue?: number | string;
1919
type: 'hour' | 'minute' | 'second' | 'millisecond' | 'meridiem';
2020
onChange: (value: number | string) => void;
21+
onHover: (value: number | string) => void;
2122
onDblClick?: VoidFunction;
2223
changeOnScroll?: boolean;
2324
}
2425

2526
export default function TimeColumn<DateType extends object>(props: TimeUnitColumnProps) {
26-
const { units, value, optionalValue, type, onChange, onDblClick, changeOnScroll } = props;
27+
const { units, value, optionalValue, type, onChange, onHover, onDblClick, changeOnScroll } =
28+
props;
2729

2830
const { prefixCls, cellRender, now, locale } = usePanelContext<DateType>();
2931

@@ -110,6 +112,12 @@ export default function TimeColumn<DateType extends object>(props: TimeUnitColum
110112
onDblClick();
111113
}
112114
}}
115+
onMouseEnter={() => {
116+
onHover(unitValue);
117+
}}
118+
onMouseLeave={() => {
119+
onHover(null);
120+
}}
113121
data-value={unitValue}
114122
>
115123
{cellRender

src/PickerPanel/TimePanel/TimePanelBody/index.tsx

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export default function TimePanelBody<DateType extends object = any>(
2626
changeOnScroll,
2727
} = props;
2828

29-
const { prefixCls, values, generateConfig, locale, onSelect, pickerValue } =
29+
const { prefixCls, values, generateConfig, locale, onSelect, onHover, pickerValue } =
3030
usePanelContext<DateType>();
3131

3232
const value = values?.[0] || null;
@@ -185,28 +185,73 @@ export default function TimePanelBody<DateType extends object = any>(
185185
generateConfig,
186186
]);
187187

188+
// ===================== Columns Change =====================
189+
const fillColumnValue = (
190+
val: number | string,
191+
func: 'setHour' | 'setMinute' | 'setSecond' | 'setMillisecond',
192+
) => {
193+
if (val === null) {
194+
return null;
195+
}
196+
return generateConfig[func](triggerDateTmpl, val as any);
197+
};
198+
199+
const getNextHourTime = (val: number) => fillColumnValue(val, 'setHour');
200+
const getNextMinuteTime = (val: number) => fillColumnValue(val, 'setMinute');
201+
const getNextSecondTime = (val: number) => fillColumnValue(val, 'setSecond');
202+
const getNextMillisecondTime = (val: number) => fillColumnValue(val, 'setMillisecond');
203+
const getMeridiemTime = (val: string) => {
204+
if (val === null) {
205+
return null;
206+
}
207+
208+
if (val === 'am' && !isAM(hour)) {
209+
return generateConfig.setHour(triggerDateTmpl, hour - 12);
210+
} else if (val === 'pm' && isAM(hour)) {
211+
return generateConfig.setHour(triggerDateTmpl, hour + 12);
212+
}
213+
return triggerDateTmpl;
214+
};
215+
188216
const onHourChange = (val: number) => {
189-
triggerChange(generateConfig.setHour(triggerDateTmpl, val));
217+
triggerChange(getNextHourTime(val));
190218
};
191219

192220
const onMinuteChange = (val: number) => {
193-
triggerChange(generateConfig.setMinute(triggerDateTmpl, val));
221+
triggerChange(getNextMinuteTime(val));
194222
};
195223

196224
const onSecondChange = (val: number) => {
197-
triggerChange(generateConfig.setSecond(triggerDateTmpl, val));
225+
triggerChange(getNextSecondTime(val));
198226
};
199227

200228
const onMillisecondChange = (val: number) => {
201-
triggerChange(generateConfig.setMillisecond(triggerDateTmpl, val));
229+
triggerChange(getNextMillisecondTime(val));
202230
};
203231

204232
const onMeridiemChange = (val: string) => {
205-
if (val === 'am' && !isAM(hour)) {
206-
triggerChange(generateConfig.setHour(triggerDateTmpl, hour - 12));
207-
} else if (val === 'pm' && isAM(hour)) {
208-
triggerChange(generateConfig.setHour(triggerDateTmpl, hour + 12));
209-
}
233+
triggerChange(getMeridiemTime(val));
234+
};
235+
236+
// ====================== Column Hover ======================
237+
const onHourHover = (val: number) => {
238+
onHover(getNextHourTime(val));
239+
};
240+
241+
const onMinuteHover = (val: number) => {
242+
onHover(getNextMinuteTime(val));
243+
};
244+
245+
const onSecondHover = (val: number) => {
246+
onHover(getNextSecondTime(val));
247+
};
248+
249+
const onMillisecondHover = (val: number) => {
250+
onHover(getNextMillisecondTime(val));
251+
};
252+
253+
const onMeridiemHover = (val: string) => {
254+
onHover(getMeridiemTime(val));
210255
};
211256

212257
// ========================= Render =========================
@@ -224,6 +269,7 @@ export default function TimePanelBody<DateType extends object = any>(
224269
optionalValue={pickerHour}
225270
type="hour"
226271
onChange={onHourChange}
272+
onHover={onHourHover}
227273
{...sharedColumnProps}
228274
/>
229275
)}
@@ -234,6 +280,7 @@ export default function TimePanelBody<DateType extends object = any>(
234280
optionalValue={pickerMinute}
235281
type="minute"
236282
onChange={onMinuteChange}
283+
onHover={onMinuteHover}
237284
{...sharedColumnProps}
238285
/>
239286
)}
@@ -244,6 +291,7 @@ export default function TimePanelBody<DateType extends object = any>(
244291
optionalValue={pickerSecond}
245292
type="second"
246293
onChange={onSecondChange}
294+
onHover={onSecondHover}
247295
{...sharedColumnProps}
248296
/>
249297
)}
@@ -254,6 +302,7 @@ export default function TimePanelBody<DateType extends object = any>(
254302
optionalValue={pickerMillisecond}
255303
type="millisecond"
256304
onChange={onMillisecondChange}
305+
onHover={onMillisecondHover}
257306
{...sharedColumnProps}
258307
/>
259308
)}
@@ -263,6 +312,7 @@ export default function TimePanelBody<DateType extends object = any>(
263312
value={meridiem}
264313
type="meridiem"
265314
onChange={onMeridiemChange}
315+
onHover={onMeridiemHover}
266316
{...sharedColumnProps}
267317
/>
268318
)}

tests/time.spec.tsx

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { render } from '@testing-library/react';
1+
import { fireEvent, render } from '@testing-library/react';
22
import { resetWarned } from 'rc-util/lib/warning';
33
import React from 'react';
4-
import { DayPicker, getDay, openPicker, selectCell } from './util/commonUtil';
4+
import { DayPicker, getDay, openPicker, selectCell, findCell } from './util/commonUtil';
55

66
describe('Picker.Time', () => {
77
beforeEach(() => {
@@ -25,4 +25,47 @@ describe('Picker.Time', () => {
2525

2626
expect(container.querySelector('input')).toHaveValue('1990-09-03 00:00');
2727
});
28+
29+
it('hover to show placeholder', async () => {
30+
const { container } = render(
31+
<DayPicker
32+
showTime={{
33+
showMillisecond: true,
34+
use12Hours: true,
35+
}}
36+
/>,
37+
);
38+
openPicker(container);
39+
40+
const getColCell = (colIndex: number, cellIndex: number) => {
41+
const column = document.querySelectorAll('.rc-picker-time-panel-column')[colIndex];
42+
const cell = column.querySelectorAll('.rc-picker-time-panel-cell-inner')[cellIndex];
43+
44+
return cell;
45+
};
46+
47+
// Hour
48+
fireEvent.mouseEnter(getColCell(0, 3));
49+
expect(container.querySelector('input')).toHaveValue('1990-09-03 03:00:00.000 AM');
50+
51+
// Let test for mouse leave
52+
fireEvent.mouseLeave(getColCell(0, 3));
53+
expect(container.querySelector('input')).toHaveValue('');
54+
55+
// Minute
56+
fireEvent.mouseEnter(getColCell(1, 2));
57+
expect(container.querySelector('input')).toHaveValue('1990-09-03 12:02:00.000 AM');
58+
59+
// Second
60+
fireEvent.mouseEnter(getColCell(2, 1));
61+
expect(container.querySelector('input')).toHaveValue('1990-09-03 12:00:01.000 AM');
62+
63+
// Millisecond
64+
fireEvent.mouseEnter(getColCell(3, 1));
65+
expect(container.querySelector('input')).toHaveValue('1990-09-03 12:00:00.100 AM');
66+
67+
// Meridiem
68+
fireEvent.mouseEnter(getColCell(4, 1));
69+
expect(container.querySelector('input')).toHaveValue('1990-09-03 12:00:00.000 PM');
70+
});
2871
});

0 commit comments

Comments
 (0)