mirror of
https://github.com/ant-design/ant-design.git
synced 2025-06-11 11:32:52 +08:00
refactor: wrap picker with FC (#34994)
* refactor: wrap picker with FC * chore: code clean * feat: cast type * test: fix test
This commit is contained in:
parent
7769ca1271
commit
9b73058045
@ -1,4 +1,5 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
|
import { forwardRef, useContext } from 'react';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import CalendarOutlined from '@ant-design/icons/CalendarOutlined';
|
import CalendarOutlined from '@ant-design/icons/CalendarOutlined';
|
||||||
import ClockCircleOutlined from '@ant-design/icons/ClockCircleOutlined';
|
import ClockCircleOutlined from '@ant-design/icons/ClockCircleOutlined';
|
||||||
@ -7,14 +8,14 @@ import SwapRightOutlined from '@ant-design/icons/SwapRightOutlined';
|
|||||||
import { RangePicker as RCRangePicker } from 'rc-picker';
|
import { RangePicker as RCRangePicker } from 'rc-picker';
|
||||||
import { GenerateConfig } from 'rc-picker/lib/generate/index';
|
import { GenerateConfig } from 'rc-picker/lib/generate/index';
|
||||||
import enUS from '../locale/en_US';
|
import enUS from '../locale/en_US';
|
||||||
import { ConfigContext, ConfigConsumerProps } from '../../config-provider';
|
import { ConfigConsumerProps, ConfigContext } from '../../config-provider';
|
||||||
import SizeContext from '../../config-provider/SizeContext';
|
import SizeContext from '../../config-provider/SizeContext';
|
||||||
import LocaleReceiver from '../../locale-provider/LocaleReceiver';
|
import LocaleReceiver from '../../locale-provider/LocaleReceiver';
|
||||||
import { getRangePlaceholder, transPlacement2DropdownAlign } from '../util';
|
import { getRangePlaceholder, transPlacement2DropdownAlign } from '../util';
|
||||||
import { RangePickerProps, PickerLocale, getTimeProps, Components } from '.';
|
import { Components, getTimeProps, PickerLocale, RangePickerProps } from '.';
|
||||||
import { PickerComponentClass } from './interface';
|
|
||||||
import { FormItemInputContext } from '../../form/context';
|
import { FormItemInputContext } from '../../form/context';
|
||||||
import { getMergedStatus, getStatusClassNames } from '../../_util/statusUtils';
|
import { getMergedStatus, getStatusClassNames } from '../../_util/statusUtils';
|
||||||
|
import { PickerComponentClass } from './interface';
|
||||||
|
|
||||||
export default function generateRangePicker<DateType>(
|
export default function generateRangePicker<DateType>(
|
||||||
generateConfig: GenerateConfig<DateType>,
|
generateConfig: GenerateConfig<DateType>,
|
||||||
@ -42,7 +43,7 @@ export default function generateRangePicker<DateType>(
|
|||||||
const locale = { ...contextLocale, ...this.props.locale };
|
const locale = { ...contextLocale, ...this.props.locale };
|
||||||
const { getPrefixCls, direction, getPopupContainer } = this.context;
|
const { getPrefixCls, direction, getPopupContainer } = this.context;
|
||||||
const {
|
const {
|
||||||
prefixCls: customizePrefixCls,
|
prefixCls,
|
||||||
getPopupContainer: customGetPopupContainer,
|
getPopupContainer: customGetPopupContainer,
|
||||||
className,
|
className,
|
||||||
placement,
|
placement,
|
||||||
@ -53,7 +54,6 @@ export default function generateRangePicker<DateType>(
|
|||||||
...restProps
|
...restProps
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { format, showTime, picker } = this.props as any;
|
const { format, showTime, picker } = this.props as any;
|
||||||
const prefixCls = getPrefixCls('picker', customizePrefixCls);
|
|
||||||
|
|
||||||
let additionalOverrideProps: any = {};
|
let additionalOverrideProps: any = {};
|
||||||
|
|
||||||
@ -105,7 +105,7 @@ export default function generateRangePicker<DateType>(
|
|||||||
[`${prefixCls}-borderless`]: !bordered,
|
[`${prefixCls}-borderless`]: !bordered,
|
||||||
},
|
},
|
||||||
getStatusClassNames(
|
getStatusClassNames(
|
||||||
prefixCls,
|
prefixCls as string,
|
||||||
getMergedStatus(contextStatus, customStatus),
|
getMergedStatus(contextStatus, customStatus),
|
||||||
hasFeedback,
|
hasFeedback,
|
||||||
),
|
),
|
||||||
@ -136,5 +136,12 @@ export default function generateRangePicker<DateType>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return RangePicker;
|
return forwardRef<RangePicker, RangePickerProps<DateType>>((props, ref) => {
|
||||||
|
const { prefixCls: customizePrefixCls } = props;
|
||||||
|
|
||||||
|
const { getPrefixCls } = useContext(ConfigContext);
|
||||||
|
const prefixCls = getPrefixCls('picker', customizePrefixCls);
|
||||||
|
|
||||||
|
return <RangePicker {...props} prefixCls={prefixCls} ref={ref} />;
|
||||||
|
}) as unknown as PickerComponentClass<RangePickerProps<DateType>>;
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import CloseCircleFilled from '@ant-design/icons/CloseCircleFilled';
|
|||||||
import RCPicker from 'rc-picker';
|
import RCPicker from 'rc-picker';
|
||||||
import { PickerMode } from 'rc-picker/lib/interface';
|
import { PickerMode } from 'rc-picker/lib/interface';
|
||||||
import { GenerateConfig } from 'rc-picker/lib/generate/index';
|
import { GenerateConfig } from 'rc-picker/lib/generate/index';
|
||||||
|
import { forwardRef, useContext } from 'react';
|
||||||
import enUS from '../locale/en_US';
|
import enUS from '../locale/en_US';
|
||||||
import { getPlaceholder, transPlacement2DropdownAlign } from '../util';
|
import { getPlaceholder, transPlacement2DropdownAlign } from '../util';
|
||||||
import devWarning from '../../_util/devWarning';
|
import devWarning from '../../_util/devWarning';
|
||||||
@ -20,9 +21,9 @@ import {
|
|||||||
getTimeProps,
|
getTimeProps,
|
||||||
Components,
|
Components,
|
||||||
} from '.';
|
} from '.';
|
||||||
import { PickerComponentClass } from './interface';
|
|
||||||
import { FormItemInputContext } from '../../form/context';
|
import { FormItemInputContext } from '../../form/context';
|
||||||
import { getMergedStatus, getStatusClassNames, InputStatus } from '../../_util/statusUtils';
|
import { getMergedStatus, getStatusClassNames, InputStatus } from '../../_util/statusUtils';
|
||||||
|
import { DatePickRef, PickerComponentClass } from './interface';
|
||||||
|
|
||||||
export default function generatePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
export default function generatePicker<DateType>(generateConfig: GenerateConfig<DateType>) {
|
||||||
type DatePickerProps = PickerProps<DateType> & {
|
type DatePickerProps = PickerProps<DateType> & {
|
||||||
@ -67,7 +68,7 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
|||||||
const locale = { ...contextLocale, ...this.props.locale };
|
const locale = { ...contextLocale, ...this.props.locale };
|
||||||
const { getPrefixCls, direction, getPopupContainer } = this.context;
|
const { getPrefixCls, direction, getPopupContainer } = this.context;
|
||||||
const {
|
const {
|
||||||
prefixCls: customizePrefixCls,
|
prefixCls,
|
||||||
getPopupContainer: customizeGetPopupContainer,
|
getPopupContainer: customizeGetPopupContainer,
|
||||||
className,
|
className,
|
||||||
size: customizeSize,
|
size: customizeSize,
|
||||||
@ -78,7 +79,6 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
|||||||
...restProps
|
...restProps
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const { format, showTime } = this.props as any;
|
const { format, showTime } = this.props as any;
|
||||||
const prefixCls = getPrefixCls('picker', customizePrefixCls);
|
|
||||||
|
|
||||||
const additionalProps = {
|
const additionalProps = {
|
||||||
showToday: true,
|
showToday: true,
|
||||||
@ -137,7 +137,7 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
|||||||
[`${prefixCls}-borderless`]: !bordered,
|
[`${prefixCls}-borderless`]: !bordered,
|
||||||
},
|
},
|
||||||
getStatusClassNames(
|
getStatusClassNames(
|
||||||
prefixCls,
|
prefixCls as string,
|
||||||
getMergedStatus(contextStatus, customStatus),
|
getMergedStatus(contextStatus, customStatus),
|
||||||
hasFeedback,
|
hasFeedback,
|
||||||
),
|
),
|
||||||
@ -167,11 +167,26 @@ export default function generatePicker<DateType>(generateConfig: GenerateConfig<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const PickerWrapper = forwardRef<DatePickRef<DateType>, InnerPickerProps>((props, ref) => {
|
||||||
|
const { prefixCls: customizePrefixCls } = props;
|
||||||
|
|
||||||
|
const { getPrefixCls } = useContext(ConfigContext);
|
||||||
|
const prefixCls = getPrefixCls('picker', customizePrefixCls);
|
||||||
|
|
||||||
|
const pickerProps: InnerPickerProps = {
|
||||||
|
...props,
|
||||||
|
prefixCls,
|
||||||
|
ref,
|
||||||
|
};
|
||||||
|
|
||||||
|
return <Picker {...pickerProps} />;
|
||||||
|
});
|
||||||
|
|
||||||
if (displayName) {
|
if (displayName) {
|
||||||
Picker.displayName = displayName;
|
PickerWrapper.displayName = displayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Picker as PickerComponentClass<InnerPickerProps>;
|
return PickerWrapper as unknown as PickerComponentClass<InnerPickerProps>;
|
||||||
}
|
}
|
||||||
|
|
||||||
const DatePicker = getPicker<DatePickerProps>();
|
const DatePicker = getPicker<DatePickerProps>();
|
||||||
|
@ -47,7 +47,7 @@ describe('TimePicker', () => {
|
|||||||
it('clearIcon should render correctly', () => {
|
it('clearIcon should render correctly', () => {
|
||||||
const clearIcon = <div className="test-clear-icon">test</div>;
|
const clearIcon = <div className="test-clear-icon">test</div>;
|
||||||
const wrapper = mount(<TimePicker clearIcon={clearIcon} />);
|
const wrapper = mount(<TimePicker clearIcon={clearIcon} />);
|
||||||
expect(wrapper.find('Picker').prop('clearIcon')).toEqual(
|
expect(wrapper.find('Picker').last().prop('clearIcon')).toEqual(
|
||||||
<div className="test-clear-icon">test</div>,
|
<div className="test-clear-icon">test</div>,
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -70,7 +70,7 @@ describe('TimePicker', () => {
|
|||||||
popupClassName={popupClassName}
|
popupClassName={popupClassName}
|
||||||
/>,
|
/>,
|
||||||
);
|
);
|
||||||
expect(wrapper.find('Picker').prop('dropdownClassName')).toEqual(popupClassName);
|
expect(wrapper.find('Picker').last().prop('dropdownClassName')).toEqual(popupClassName);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should pass popupClassName prop to RangePicker as dropdownClassName prop', () => {
|
it('should pass popupClassName prop to RangePicker as dropdownClassName prop', () => {
|
||||||
|
Loading…
Reference in New Issue
Block a user