Skip to content

Commit dde3392

Browse files
committed
Next it of un-input picker
1 parent 665ae04 commit dde3392

File tree

1 file changed

+65
-21
lines changed

1 file changed

+65
-21
lines changed

src/RangePicker.tsx

Lines changed: 65 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ function reorderValues<DateType>(
7777
return values;
7878
}
7979

80+
function canValueTrigger<DateType>(
81+
value: EventValue<DateType>,
82+
index: number,
83+
allowEmpty?: [boolean, boolean] | null,
84+
): boolean {
85+
return !!(value || (allowEmpty && allowEmpty[index]));
86+
}
87+
8088
export interface RangePickerSharedProps<DateType> {
8189
value?: RangeValue<DateType>;
8290
defaultValue?: RangeValue<DateType>;
@@ -175,6 +183,7 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
175183
locale,
176184
placeholder,
177185
autoFocus,
186+
allowEmpty,
178187
disabled,
179188
format,
180189
picker = 'date',
@@ -325,36 +334,70 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
325334
}, [mergedOpen]);
326335

327336
// ============================ Trigger ============================
328-
const triggerChange = (newValue: RangeValue<DateType>) => {
337+
let triggerOpen: (
338+
newOpen: boolean,
339+
index: 0 | 1,
340+
preventChangeEvent?: boolean,
341+
) => void;
342+
343+
const triggerChange = (
344+
newValue: RangeValue<DateType>,
345+
forceInput: boolean = true,
346+
) => {
329347
const values = reorderValues(newValue, generateConfig);
330348

331349
setSelectedValue(values);
332-
setInnerValue(values);
333350

334351
const startValue = getIndexValue(values, 0);
335352
const endValue = getIndexValue(values, 1);
336353

337-
if (
338-
onChange &&
339-
(!isEqual(generateConfig, getIndexValue(mergedValue, 0), startValue) ||
340-
!isEqual(generateConfig, getIndexValue(mergedValue, 1), endValue))
341-
) {
342-
onChange(values, [
343-
startValue
344-
? generateConfig.locale.format(
345-
locale.locale,
346-
startValue,
347-
formatList[0],
348-
)
349-
: '',
350-
endValue
351-
? generateConfig.locale.format(locale.locale, endValue, formatList[0])
352-
: '',
353-
]);
354+
const canStartValueTrigger = canValueTrigger(startValue, 0, allowEmpty);
355+
const canEndValueTrigger = canValueTrigger(endValue, 1, allowEmpty);
356+
357+
const canTrigger =
358+
values === null || (canStartValueTrigger && canEndValueTrigger);
359+
360+
if (canTrigger) {
361+
// Trigger onChange only when value is validate
362+
setInnerValue(values);
363+
364+
if (
365+
onChange &&
366+
(!isEqual(generateConfig, getIndexValue(mergedValue, 0), startValue) ||
367+
!isEqual(generateConfig, getIndexValue(mergedValue, 1), endValue))
368+
) {
369+
onChange(values, [
370+
startValue
371+
? generateConfig.locale.format(
372+
locale.locale,
373+
startValue,
374+
formatList[0],
375+
)
376+
: '',
377+
endValue
378+
? generateConfig.locale.format(
379+
locale.locale,
380+
endValue,
381+
formatList[0],
382+
)
383+
: '',
384+
]);
385+
}
386+
} else if (forceInput) {
387+
// Open miss value panel to force user input
388+
const missingValueIndex = canStartValueTrigger ? 1 : 0;
389+
triggerOpen(true, missingValueIndex);
390+
391+
// Delay to focus to avoid input blur trigger expired selectedValues
392+
setTimeout(() => {
393+
if (endInputRef.current) {
394+
endInputRef.current.focus();
395+
}
396+
}, 0);
354397
}
355398
};
356399

357-
const triggerOpen = (
400+
triggerOpen = (
358401
newOpen: boolean,
359402
index: 0 | 1,
360403
preventChangeEvent: boolean = false,
@@ -536,7 +579,8 @@ function InnerRangePicker<DateType>(props: RangePickerProps<DateType>) {
536579
e.preventDefault();
537580
}}
538581
onSelect={date => {
539-
setSelectedValue(
582+
// triggerChange will also update selected values
583+
triggerChange(
540584
updateRangeValue(selectedValue, date, activePickerIndex),
541585
);
542586
}}

0 commit comments

Comments
 (0)