Skip to content

Commit fcbcac8

Browse files
authored
chore: auto order for multiple logic (#732)
* test: more test case * chore: adjust order logic
1 parent 848f1a3 commit fcbcac8

File tree

4 files changed

+36
-7
lines changed

4 files changed

+36
-7
lines changed

src/PickerInput/RangePicker.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ function RangePicker<DateType extends object = any>(
238238
locale,
239239
formatList,
240240
true,
241+
false,
241242
defaultValue,
242243
value,
243244
onCalendarChange,

src/PickerInput/SinglePicker.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ function Picker<DateType extends object = any>(
125125
classNames,
126126

127127
// Value
128+
order,
128129
defaultValue,
129130
value,
130131
needConfirm,
@@ -224,6 +225,7 @@ function Picker<DateType extends object = any>(
224225
locale,
225226
formatList,
226227
false,
228+
order,
227229
defaultValue,
228230
value,
229231
onInternalCalendarChange,

src/PickerInput/hooks/useRangeValue.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,13 @@ function useUtil<MergedValueType extends object[], DateType extends MergedValueT
6565
return [getDateTexts, isSameDates] as const;
6666
}
6767

68+
function orderDates<DateType extends object, DatesType extends DateType[]>(
69+
dates: DatesType,
70+
generateConfig: GenerateConfig<DateType>,
71+
) {
72+
return [...dates].sort((a, b) => (generateConfig.isAfter(a, b) ? 1 : -1)) as DatesType;
73+
}
74+
6875
/**
6976
* Used for internal value management.
7077
* It should always use `mergedValue` in render logic
@@ -94,6 +101,12 @@ export function useInnerValue<ValueType extends DateType[], DateType extends obj
94101
formatList: FormatType[],
95102
/** Used for RangePicker. `true` means [DateType, DateType] or will be DateType[] */
96103
rangeValue: boolean,
104+
/**
105+
* Trigger order when trigger calendar value change.
106+
* This should only used in SinglePicker with `multiple` mode.
107+
* So when `rangeValue` is `true`, order will be ignored.
108+
*/
109+
order: boolean,
97110
defaultValue?: ValueType,
98111
value?: ValueType,
99112
onCalendarChange?: (
@@ -117,12 +130,14 @@ export function useInnerValue<ValueType extends DateType[], DateType extends obj
117130

118131
const triggerCalendarChange: TriggerCalendarChange<ValueType> = useEvent(
119132
(nextCalendarValues: ValueType) => {
120-
const clone = [...nextCalendarValues] as ValueType;
133+
let clone = [...nextCalendarValues] as ValueType;
121134

122135
if (rangeValue) {
123136
for (let i = 0; i < 2; i += 1) {
124137
clone[i] = clone[i] || null;
125138
}
139+
} else if (order) {
140+
clone = orderDates(clone, generateConfig);
126141
}
127142

128143
// Update merged value
@@ -142,7 +157,7 @@ export function useInnerValue<ValueType extends DateType[], DateType extends obj
142157
},
143158
);
144159

145-
const triggerOk = ()=> {
160+
const triggerOk = () => {
146161
if (onOk) {
147162
onOk(calendarValue());
148163
}
@@ -209,7 +224,7 @@ export default function useRangeValue<ValueType extends DateType[], DateType ext
209224
const triggerSubmit = useEvent((nextValue?: ValueType) => {
210225
const isNullValue = nextValue === null;
211226

212-
const clone = [...(nextValue || submitValue())] as ValueType;
227+
let clone = [...(nextValue || submitValue())] as ValueType;
213228

214229
// Fill null value
215230
if (isNullValue) {
@@ -224,7 +239,7 @@ export default function useRangeValue<ValueType extends DateType[], DateType ext
224239

225240
// Only when exist value to sort
226241
if (orderOnChange && clone[0] && clone[1]) {
227-
clone.sort((a, b) => (generateConfig.isAfter(a, b) ? 1 : -1));
242+
clone = orderDates(clone, generateConfig);
228243
}
229244

230245
// Sync `calendarValue`

tests/multiple.spec.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,26 @@ describe('Picker.Multiple', () => {
2525

2626
it('onChange', () => {
2727
const onChange = jest.fn();
28-
const { container } = render(<DayPicker multiple onChange={onChange} />);
28+
const onCalendarChange = jest.fn();
29+
const { container } = render(
30+
<DayPicker multiple onChange={onChange} onCalendarChange={onCalendarChange} />,
31+
);
2932

3033
expect(container.querySelector('.rc-picker-multiple')).toBeTruthy();
3134

3235
openPicker(container);
33-
selectCell(1);
36+
37+
// Select 3, 1
3438
selectCell(3);
35-
selectCell(5);
39+
selectCell(1);
40+
expect(onCalendarChange).toHaveBeenCalledWith(
41+
expect.anything(),
42+
['1990-09-01', '1990-09-03'],
43+
expect.anything(),
44+
);
3645

46+
// Select 5
47+
selectCell(5);
3748
expect(onChange).not.toHaveBeenCalled();
3849
expect(isOpen()).toBeTruthy();
3950

0 commit comments

Comments
 (0)