mirror of
https://gitee.com/ant-design/ant-design.git
synced 2024-12-15 17:31:25 +08:00
c3e51506cc
* feat: add Space.Compact * feat: update input style * feat: add CompactItem for context memoize * feat: add demo * feat: update button style * feat: update input style * feat: 提取 getCompactClassNames 公用方法 * feat: update button style * feat: update picker * feat: add block prop for Space.Compact * feat: use Space.Compact for Input#addonBefore/After * feat: update addon * refactor: compact * feat: update * feat: update * feat: migrate styles to compact for new Input/Input.Search * feat: organize input demo * feat: add more button compact demo * feat: resolve select border collapse * feat: fix input addon select style * feat: add input addon demo in Space * feat: add useCompactItemContext hook * feat: update compact-item style * feat: rollback input#addon implements * feat: rollback input#addon and input.search style * feat: select border collapse * feat: add Space.Compact demo * feat: Space.Compact vertical for Button * refactor: useCompactItemContext * feat: update Button vertical demo * feat: rtl for compact mixin * feat: rtl for compact button * feat: input rtl * feat: add docs for Space.Compact * test: add some tests for Space.Compact * test: add tests * feat: select style * feat: handle select focus style * feat: add useCompactItemContext for Picker and Cascader * style: add compact-item style for cascader * feat: support nested Space.Compact * style: Input.Search in Space.Compact * chore: clean * feat: add useCompactItemContext for TreeSelect * fix: lint issues * fix: style lint * docs: update demos for Space.Compact * docs: update demo * fix: add deps-lint-skip for space * fix: add deps-lint-skip for space * fix: handle edge case for useCompactItemContext * test: add search test case * chore: + bundlesize * style: merge button compact style into one file * style: improve style for nested compact * fix: stylelint * docs: update Space.Compact docs * test: update demo snapshot * test: update input debug test snapshot * docs: update doccs for Space.Compact * test: improve test cases for Compact * docs: clean demos for Compact * refactor: improve Space.Compact * fix: add useCompactItemContext for Input.Search * style: improve compact border-radius implementation * refactor: use context to make nested compact works * fix: input-number focused style * refactor: remove useless style * refactor: improve style for vertical compact * test: update snapshot * test: update snapshot for input * refactor: improve compact-item-border-radius * fix: search group in RTL * style: improve style for button compact * style: use after * fix: stylelint * chore: update snapshot * style: improve button compact * refactor: improve btn-icon-only style in compact
154 lines
6.0 KiB
TypeScript
154 lines
6.0 KiB
TypeScript
import CalendarOutlined from '@ant-design/icons/CalendarOutlined';
|
|
import ClockCircleOutlined from '@ant-design/icons/ClockCircleOutlined';
|
|
import CloseCircleFilled from '@ant-design/icons/CloseCircleFilled';
|
|
import SwapRightOutlined from '@ant-design/icons/SwapRightOutlined';
|
|
import classNames from 'classnames';
|
|
import { RangePicker as RCRangePicker } from 'rc-picker';
|
|
import type { GenerateConfig } from 'rc-picker/lib/generate/index';
|
|
import * as React from 'react';
|
|
import { forwardRef, useContext, useImperativeHandle } from 'react';
|
|
import type { RangePickerProps } from '.';
|
|
import { Components, getTimeProps } from '.';
|
|
import { ConfigContext } from '../../config-provider';
|
|
import DisabledContext from '../../config-provider/DisabledContext';
|
|
import SizeContext from '../../config-provider/SizeContext';
|
|
import { FormItemInputContext } from '../../form/context';
|
|
import { useCompactItemContext } from '../../space/Compact';
|
|
import LocaleReceiver from '../../locale-provider/LocaleReceiver';
|
|
import { getMergedStatus, getStatusClassNames } from '../../_util/statusUtils';
|
|
import enUS from '../locale/en_US';
|
|
import { getRangePlaceholder, transPlacement2DropdownAlign } from '../util';
|
|
import type { CommonPickerMethods, PickerComponentClass } from './interface';
|
|
import warning from '../../_util/warning';
|
|
|
|
export default function generateRangePicker<DateType>(
|
|
generateConfig: GenerateConfig<DateType>,
|
|
): PickerComponentClass<RangePickerProps<DateType>> {
|
|
type InternalRangePickerProps = RangePickerProps<DateType> & {};
|
|
|
|
const RangePicker = forwardRef<
|
|
InternalRangePickerProps | CommonPickerMethods,
|
|
RangePickerProps<DateType> & {
|
|
/**
|
|
* @deprecated `dropdownClassName` is deprecated which will be removed in next major
|
|
* version.Please use `popupClassName` instead.
|
|
*/
|
|
dropdownClassName: string;
|
|
popupClassName?: string;
|
|
}
|
|
>((props, ref) => {
|
|
const {
|
|
prefixCls: customizePrefixCls,
|
|
getPopupContainer: customGetPopupContainer,
|
|
className,
|
|
placement,
|
|
size: customizeSize,
|
|
disabled: customDisabled,
|
|
bordered = true,
|
|
placeholder,
|
|
popupClassName,
|
|
dropdownClassName,
|
|
status: customStatus,
|
|
...restProps
|
|
} = props;
|
|
|
|
const innerRef = React.useRef<RCRangePicker<DateType>>(null);
|
|
const { getPrefixCls, direction, getPopupContainer } = useContext(ConfigContext);
|
|
const prefixCls = getPrefixCls('picker', customizePrefixCls);
|
|
const { compactSize, compactItemClassnames } = useCompactItemContext(prefixCls, direction);
|
|
const { format, showTime, picker } = props as any;
|
|
const rootPrefixCls = getPrefixCls();
|
|
|
|
let additionalOverrideProps: any = {};
|
|
additionalOverrideProps = {
|
|
...additionalOverrideProps,
|
|
...(showTime ? getTimeProps({ format, picker, ...showTime }) : {}),
|
|
...(picker === 'time' ? getTimeProps({ format, ...props, picker }) : {}),
|
|
};
|
|
|
|
warning(
|
|
!dropdownClassName,
|
|
'RangePicker',
|
|
'`dropdownClassName` is deprecated which will be removed in next major version. Please use `popupClassName` instead.',
|
|
);
|
|
|
|
// ===================== Size =====================
|
|
const size = React.useContext(SizeContext);
|
|
const mergedSize = compactSize || customizeSize || size;
|
|
|
|
// ===================== Disabled =====================
|
|
const disabled = React.useContext(DisabledContext);
|
|
const mergedDisabled = customDisabled ?? disabled;
|
|
|
|
// ===================== FormItemInput =====================
|
|
const formItemContext = useContext(FormItemInputContext);
|
|
const { hasFeedback, status: contextStatus, feedbackIcon } = formItemContext;
|
|
|
|
const suffixNode = (
|
|
<>
|
|
{picker === 'time' ? <ClockCircleOutlined /> : <CalendarOutlined />}
|
|
{hasFeedback && feedbackIcon}
|
|
</>
|
|
);
|
|
|
|
useImperativeHandle(ref, () => ({
|
|
focus: () => innerRef.current?.focus(),
|
|
blur: () => innerRef.current?.blur(),
|
|
}));
|
|
|
|
return (
|
|
<LocaleReceiver componentName="DatePicker" defaultLocale={enUS}>
|
|
{contextLocale => {
|
|
const locale = { ...contextLocale, ...props.locale };
|
|
|
|
return (
|
|
<RCRangePicker<DateType>
|
|
separator={
|
|
<span aria-label="to" className={`${prefixCls}-separator`}>
|
|
<SwapRightOutlined />
|
|
</span>
|
|
}
|
|
disabled={mergedDisabled}
|
|
ref={innerRef}
|
|
dropdownClassName={popupClassName || dropdownClassName}
|
|
dropdownAlign={transPlacement2DropdownAlign(direction, placement)}
|
|
placeholder={getRangePlaceholder(picker, locale, placeholder)}
|
|
suffixIcon={suffixNode}
|
|
clearIcon={<CloseCircleFilled />}
|
|
prevIcon={<span className={`${prefixCls}-prev-icon`} />}
|
|
nextIcon={<span className={`${prefixCls}-next-icon`} />}
|
|
superPrevIcon={<span className={`${prefixCls}-super-prev-icon`} />}
|
|
superNextIcon={<span className={`${prefixCls}-super-next-icon`} />}
|
|
allowClear
|
|
transitionName={`${rootPrefixCls}-slide-up`}
|
|
{...restProps}
|
|
{...additionalOverrideProps}
|
|
className={classNames(
|
|
{
|
|
[`${prefixCls}-${mergedSize}`]: mergedSize,
|
|
[`${prefixCls}-borderless`]: !bordered,
|
|
},
|
|
getStatusClassNames(
|
|
prefixCls as string,
|
|
getMergedStatus(contextStatus, customStatus),
|
|
hasFeedback,
|
|
),
|
|
compactItemClassnames,
|
|
className,
|
|
)}
|
|
locale={locale!.lang}
|
|
prefixCls={prefixCls}
|
|
getPopupContainer={customGetPopupContainer || getPopupContainer}
|
|
generateConfig={generateConfig}
|
|
components={Components}
|
|
direction={direction}
|
|
/>
|
|
);
|
|
}}
|
|
</LocaleReceiver>
|
|
);
|
|
});
|
|
|
|
return RangePicker as unknown as PickerComponentClass<RangePickerProps<DateType>>;
|
|
}
|