Skip to content

Commit 71ad1ba

Browse files
Kim-Wing-FungKim-Wing-Fung
andauthored
Add onSelect callback for range picker (#93)
* Add support for onSelect callback for RangePicker * Correctly escape character in markdown * Fix incorrect markdown separation * Update onCalendarChange parameters instead of adding onSelect callback. * Update onCalendarChange parameters instead of adding onSelect callback. * Fix type of info * Refactor info type and simplify change logic Co-authored-by: Kim-Wing-Fung <c-kfung@powercosts.com>
1 parent 2b5a239 commit 71ad1ba

File tree

3 files changed

+57
-8
lines changed

3 files changed

+57
-8
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ render(<Picker />, mountNode);
129129
| selectable | [Boolean, Boolean] | | whether to selected picker |
130130
| disabled | Boolean | false | whether the range picker is disabled |
131131
| onChange | Function(value:[moment], formatString: [string, string]) | | a callback function, can be executed when the selected time is changing |
132-
| onCalendarChange | Function(value:[moment], formatString: [string, string]) | | a callback function, can be executed when the start time or the end time of the range is changing |
132+
| onCalendarChange | Function(value:[moment], formatString: [string, string], info: { range:'start'\|'end' }) | | a callback function, can be executed when the start time or the end time of the range is changing |
133133
| direction | String: ltr or rtl | | Layout direction of picker component, it supports RTL direction too. |
134134
| order | Boolean | true | (TimeRangePicker only) `false` to disable auto order |
135135

src/RangePicker.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,16 @@ function canValueTrigger<DateType>(
6262
return false;
6363
}
6464

65+
export type RangeType = 'start' | 'end';
66+
67+
export interface RangeInfo {
68+
range: RangeType;
69+
}
70+
6571
export type RangeDateRender<DateType> = (
6672
currentDate: DateType,
6773
today: DateType,
68-
info: {
69-
range: 'start' | 'end';
70-
},
74+
info: RangeInfo,
7175
) => React.ReactNode;
7276

7377
export interface RangePickerSharedProps<DateType> {
@@ -77,7 +81,7 @@ export interface RangePickerSharedProps<DateType> {
7781
defaultPickerValue?: [DateType, DateType];
7882
placeholder?: [string, string];
7983
disabled?: boolean | [boolean, boolean];
80-
disabledTime?: (date: EventValue<DateType>, type: 'start' | 'end') => DisabledTimes;
84+
disabledTime?: (date: EventValue<DateType>, type: RangeType) => DisabledTimes;
8185
ranges?: Record<
8286
string,
8387
Exclude<RangeValue<DateType>, null> | (() => Exclude<RangeValue<DateType>, null>)
@@ -86,7 +90,11 @@ export interface RangePickerSharedProps<DateType> {
8690
allowEmpty?: [boolean, boolean];
8791
mode?: [PanelMode, PanelMode];
8892
onChange?: (values: RangeValue<DateType>, formatString: [string, string]) => void;
89-
onCalendarChange?: (values: RangeValue<DateType>, formatString: [string, string]) => void;
93+
onCalendarChange?: (
94+
values: RangeValue<DateType>,
95+
formatString: [string, string],
96+
info: RangeInfo,
97+
) => void;
9098
onPanelChange?: (values: RangeValue<DateType>, modes: [PanelMode, PanelMode]) => void;
9199
onFocus?: React.FocusEventHandler<HTMLInputElement>;
92100
onBlur?: React.FocusEventHandler<HTMLInputElement>;
@@ -436,7 +444,9 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
436444
: '';
437445

438446
if (onCalendarChange) {
439-
onCalendarChange(values, [startStr, endStr]);
447+
const info: RangeInfo = { range: sourceIndex === 0 ? 'start' : 'end' };
448+
449+
onCalendarChange(values, [startStr, endStr], info);
440450
}
441451

442452
// >>>>> Trigger `onChange` event

tests/range.spec.tsx

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -843,14 +843,29 @@ describe('Picker.Range', () => {
843843

844844
// Not trigger when not value
845845
expect(wrapper.find('.rc-picker-ok button').props().disabled).toBeTruthy();
846+
expect(onCalendarChange).not.toHaveBeenCalled();
846847

847-
// Trigger when valued
848+
// Trigger when start Ok'd
848849
onCalendarChange.mockReset();
849850
wrapper.selectCell(11);
851+
expect(onCalendarChange).not.toHaveBeenCalled();
850852
wrapper.find('.rc-picker-ok button').simulate('click');
851853
expect(onCalendarChange).toHaveBeenCalledWith(
852854
[expect.anything(), null],
853855
['1990-09-11 00:00:00', ''],
856+
{ range: 'start' },
857+
);
858+
expect(onOk).toHaveBeenCalled();
859+
860+
// Trigger when end Ok'd
861+
onCalendarChange.mockReset();
862+
wrapper.selectCell(23);
863+
expect(onCalendarChange).not.toHaveBeenCalled();
864+
wrapper.find('.rc-picker-ok button').simulate('click');
865+
expect(onCalendarChange).toHaveBeenCalledWith(
866+
[expect.anything(), expect.anything()],
867+
['1990-09-11 00:00:00', '1990-09-23 00:00:00'],
868+
{ range: 'end' },
854869
);
855870
expect(onOk).toHaveBeenCalled();
856871
});
@@ -1387,4 +1402,28 @@ describe('Picker.Range', () => {
13871402
const wrapper = mount(<MomentRangePicker open panelRender={() => <h1>Light</h1>} />);
13881403
expect(wrapper.render()).toMatchSnapshot();
13891404
});
1405+
1406+
describe('Selection callbacks', () => {
1407+
it('selection provide info for onCalendarChange', () => {
1408+
const onCalendarChange = jest.fn();
1409+
1410+
const wrapper = mount(<MomentRangePicker onCalendarChange={onCalendarChange} />);
1411+
1412+
wrapper.openPicker();
1413+
1414+
// Start date
1415+
wrapper.selectCell(11);
1416+
expect(onCalendarChange).toHaveBeenCalledWith([expect.anything(), null], ['1990-09-11', ''], {
1417+
range: 'start',
1418+
});
1419+
1420+
// End date
1421+
wrapper.selectCell(23);
1422+
expect(onCalendarChange).toHaveBeenCalledWith(
1423+
[expect.anything(), expect.anything()],
1424+
['1990-09-11', '1990-09-23'],
1425+
{ range: 'end' },
1426+
);
1427+
});
1428+
});
13901429
});

0 commit comments

Comments
 (0)