diff --git a/assets/index.less b/assets/index.less index ad35abae7..bda1dc027 100644 --- a/assets/index.less +++ b/assets/index.less @@ -444,6 +444,6 @@ &-panel-container { display: inline-block; vertical-align: top; - transition: margin 0.3s; + transition: transform 0.3s; } } diff --git a/examples/panelRender.tsx b/examples/panelRender.tsx index cfecee66b..8ab2456ba 100644 --- a/examples/panelRender.tsx +++ b/examples/panelRender.tsx @@ -1,5 +1,6 @@ import React from 'react'; -import moment, { Moment } from 'moment'; +import type { Moment } from 'moment'; +import moment from 'moment'; import Picker from '../src/Picker'; import RangePicker from '../src/RangePicker'; import momentGenerateConfig from '../src/generate/moment'; @@ -25,7 +26,7 @@ export default () => { locale={zhCN} allowClear defaultValue={defaultStartValue} - panelRender={node => ( + panelRender={(node) => ( <> - {customizeNode ? My Panel : node} - - )} + panelRender={(node) => <>{customizeNode ? My Panel : node}} + /> + +
+

RangePicker - Time

+ + generateConfig={momentGenerateConfig} + locale={zhCN} + allowClear + defaultValue={defaultValue} + picker="time" + /> +
+
+

RangePicker - week

+ + generateConfig={momentGenerateConfig} + locale={zhCN} + allowClear + defaultValue={defaultValue} + picker="week" + /> +
+
+

RangePicker - month

+ + generateConfig={momentGenerateConfig} + locale={zhCN} + allowClear + defaultValue={defaultValue} + picker="month" + /> +
+
+

RangePicker - year

+ + generateConfig={momentGenerateConfig} + locale={zhCN} + allowClear + defaultValue={defaultValue} + picker="year" />
diff --git a/src/RangePicker.tsx b/src/RangePicker.tsx index fec2ffa93..af11984c9 100644 --- a/src/RangePicker.tsx +++ b/src/RangePicker.tsx @@ -137,15 +137,18 @@ type RangeShowTimeObject = Omit, 'defaultVal defaultValue?: DateType[]; }; -export type RangePickerBaseProps = {} & RangePickerSharedProps & OmitPickerProps>; +export type RangePickerBaseProps = {} & RangePickerSharedProps & + OmitPickerProps>; export type RangePickerDateProps = { showTime?: boolean | RangeShowTimeObject; -} & RangePickerSharedProps & OmitPickerProps>; +} & RangePickerSharedProps & + OmitPickerProps>; export type RangePickerTimeProps = { order?: boolean; -} & RangePickerSharedProps & OmitPickerProps>; +} & RangePickerSharedProps & + OmitPickerProps>; export type RangePickerProps = | RangePickerBaseProps @@ -224,6 +227,7 @@ function InnerRangePicker(props: RangePickerProps) { const containerRef = useRef(null); const panelDivRef = useRef(null); + const rangeWrapperRef = useRef(null); const startInputDivRef = useRef(null); const endInputDivRef = useRef(null); const separatorRef = useRef(null); @@ -239,9 +243,8 @@ function InnerRangePicker(props: RangePickerProps) { }); // Operation ref - const operationRef: React.MutableRefObject = useRef< - ContextOperationRefProps - >(null); + const operationRef: React.MutableRefObject = + useRef(null); const mergedDisabled = React.useMemo<[boolean, boolean]>(() => { if (Array.isArray(disabled)) { @@ -255,7 +258,7 @@ function InnerRangePicker(props: RangePickerProps) { const [mergedValue, setInnerValue] = useMergedState>(null, { value, defaultValue, - postState: values => + postState: (values) => picker === 'time' && !order ? values : reorderValues(values, generateConfig), }); @@ -270,7 +273,7 @@ function InnerRangePicker(props: RangePickerProps) { // ========================= Select Values ========================= const [selectedValue, setSelectedValue] = useMergedState(mergedValue, { - postState: values => { + postState: (values) => { let postValues = values; if (mergedDisabled[0] && mergedDisabled[1]) { @@ -322,8 +325,8 @@ function InnerRangePicker(props: RangePickerProps) { const [mergedOpen, triggerInnerOpen] = useMergedState(false, { value: open, defaultValue: defaultOpen, - postState: postOpen => (mergedDisabled[mergedActivePickerIndex] ? false : postOpen), - onChange: newOpen => { + postState: (postOpen) => (mergedDisabled[mergedActivePickerIndex] ? false : postOpen), + onChange: (newOpen) => { if (onOpenChange) { onOpenChange(newOpen); } @@ -533,12 +536,12 @@ function InnerRangePicker(props: RangePickerProps) { const [startText, triggerStartTextChange, resetStartText] = useTextValueMapping({ valueTexts: startValueTexts, - onTextChange: newText => onTextChange(newText, 0), + onTextChange: (newText) => onTextChange(newText, 0), }); const [endText, triggerEndTextChange, resetEndText] = useTextValueMapping({ valueTexts: endValueTexts, - onTextChange: newText => onTextChange(newText, 1), + onTextChange: (newText) => onTextChange(newText, 1), }); const [rangeHoverValue, setRangeHoverValue] = useState>(null); @@ -731,7 +734,7 @@ function InnerRangePicker(props: RangePickerProps) { // ============================ Ranges ============================= const rangeLabels = Object.keys(ranges || {}); - const rangeList = rangeLabels.map(label => { + const rangeList = rangeLabels.map((label) => { const range = ranges![label]; const newValues = typeof range === 'function' ? range() : range; @@ -766,10 +769,8 @@ function InnerRangePicker(props: RangePickerProps) { panelHoverRangedValue = hoverRangedValue; } - let panelShowTime: - | boolean - | SharedTimeProps - | undefined = showTime as SharedTimeProps; + let panelShowTime: boolean | SharedTimeProps | undefined = + showTime as SharedTimeProps; if (showTime && typeof showTime === 'object' && showTime.defaultValue) { const timeDefaultValues: DateType[] = showTime.defaultValue!; panelShowTime = { @@ -805,7 +806,7 @@ function InnerRangePicker(props: RangePickerProps) { style={undefined} direction={direction} disabledDate={mergedActivePickerIndex === 0 ? disabledStartDate : disabledEndDate} - disabledTime={date => { + disabledTime={(date) => { if (disabledTime) { return disabledTime(date, mergedActivePickerIndex === 0 ? 'start' : 'end'); } @@ -855,14 +856,15 @@ function InnerRangePicker(props: RangePickerProps) { mergedActivePickerIndex && startInputDivRef.current && separatorRef.current && - panelDivRef.current + panelDivRef.current && + rangeWrapperRef.current ) { // Arrow offset arrowLeft = startInputDivRef.current.offsetWidth + separatorRef.current.offsetWidth; + const panelDivOffsetLeft = panelDivRef.current.offsetLeft; + const distanceToWrapper = rangeWrapperRef.current.offsetWidth - panelDivRef.current.offsetWidth; - if (panelDivRef.current.offsetWidth && arrowLeft > panelDivRef.current.offsetWidth) { - panelLeft = arrowLeft; - } + panelLeft = panelDivOffsetLeft === 0 ? distanceToWrapper : distanceToWrapper * -1; } const arrowPositionStyle = direction === 'rtl' ? { right: arrowLeft } : { left: arrowLeft }; @@ -903,13 +905,13 @@ function InnerRangePicker(props: RangePickerProps) { const showDoublePanel = currentMode === picker; const leftPanel = renderPanel(showDoublePanel ? 'left' : false, { pickerValue: viewDate, - onPickerValueChange: newViewDate => { + onPickerValueChange: (newViewDate) => { setViewDate(newViewDate, mergedActivePickerIndex); }, }); const rightPanel = renderPanel('right', { pickerValue: nextViewDate, - onPickerValueChange: newViewDate => { + onPickerValueChange: (newViewDate) => { setViewDate( getClosingViewDate(newViewDate, picker, generateConfig, -1), mergedActivePickerIndex, @@ -955,9 +957,9 @@ function InnerRangePicker(props: RangePickerProps) { return (
{ + onMouseDown={(e) => { e.preventDefault(); }} > @@ -970,6 +972,7 @@ function InnerRangePicker(props: RangePickerProps) {
@@ -991,11 +994,11 @@ function InnerRangePicker(props: RangePickerProps) { ) { clearNode = ( { + onMouseDown={(e) => { e.preventDefault(); e.stopPropagation(); }} - onMouseUp={e => { + onMouseUp={(e) => { e.preventDefault(); e.stopPropagation(); let values = mergedValue; @@ -1101,7 +1104,7 @@ function InnerRangePicker(props: RangePickerProps) { disabled={mergedDisabled[0]} readOnly={inputReadOnly || typeof formatList[0] === 'function' || !startTyping} value={startHoverValue || startText} - onChange={e => { + onChange={(e) => { triggerStartTextChange(e.target.value); }} autoFocus={autoFocus} @@ -1126,7 +1129,7 @@ function InnerRangePicker(props: RangePickerProps) { disabled={mergedDisabled[1]} readOnly={inputReadOnly || typeof formatList[0] === 'function' || !endTyping} value={endHoverValue || endText} - onChange={e => { + onChange={(e) => { triggerEndTextChange(e.target.value); }} placeholder={getValue(placeholder, 1) || ''} diff --git a/tests/range.spec.tsx b/tests/range.spec.tsx index 3c6742771..bd1b9472c 100644 --- a/tests/range.spec.tsx +++ b/tests/range.spec.tsx @@ -675,8 +675,8 @@ describe('Picker.Range', () => { const wrapper = mount(); wrapper.openPicker(1); wrapper.update(); - expect((wrapper.find('.rc-picker-panel-container').props() as any).style.marginLeft).toEqual( - 200, + expect((wrapper.find('.rc-picker-panel-container').props() as any).style.transform).toEqual( + 'translateX(200px)', ); }); });