import React from 'react'; import { PropTypes } from 'react'; import RcSelect, { Option, OptGroup } from 'rc-select'; import classNames from 'classnames'; export type SelectValue = string | any[] | { key: string, label: React.ReactNode } | Array<{ key: string, label: React.ReactNode }>; export interface AbstractSelectProps { size?: 'default' | 'large' | 'small'; className?: string; notFoundContent?: React.ReactNode | null; prefixCls?: string; transitionName?: string; optionLabelProp?: string; choiceTransitionName?: string; showSearch?: boolean; allowClear?: boolean; disabled?: boolean; style?: React.CSSProperties; placeholder?: string; filterOption?: boolean | ((inputValue: string, option: Object) => any); } export interface SelectProps extends AbstractSelectProps { value?: SelectValue; defaultValue?: SelectValue; combobox?: boolean; multiple?: boolean; tags?: boolean; onSelect?: (value: SelectValue, option: Object) => any; onDeselect?: (value: SelectValue) => any; onSearch?: (value: string) => any; dropdownMatchSelectWidth?: boolean; optionFilterProp?: string; defaultActiveFirstOption?: boolean; labelInValue?: boolean; getPopupContainer?: (triggerNode?: HTMLElement) => HTMLElement; dropdownStyle?: React.CSSProperties; dropdownMenuStyle?: React.CSSProperties; onChange?: (value: SelectValue) => void; tokenSeparators?: string[]; getInputElement?: () => React.ReactElement; } export interface OptionProps { disabled?: boolean; value?: any; } export interface OptGroupProps { label?: string | React.ReactElement; } export interface SelectContext { antLocale?: { Select?: any, }; } // => It is needless to export the declaration of below two inner components. // export { Option, OptGroup }; export default class Select extends React.Component { static Option = Option as React.ClassicComponentClass; static OptGroup = OptGroup as React.ClassicComponentClass; static defaultProps = { prefixCls: 'ant-select', showSearch: false, transitionName: 'slide-up', choiceTransitionName: 'zoom', }; static propTypes = { prefixCls: PropTypes.string, className: PropTypes.string, size: PropTypes.oneOf(['default', 'large', 'small']), combobox: PropTypes.bool, notFoundContent: PropTypes.any, showSearch: PropTypes.bool, optionLabelProp: PropTypes.string, transitionName: PropTypes.string, choiceTransitionName: PropTypes.string, }; context: SelectContext; render() { const { prefixCls, className = '', size, combobox, } = this.props; let { notFoundContent = 'Not Found', optionLabelProp } = this.props; const cls = classNames({ [`${prefixCls}-lg`]: size === 'large', [`${prefixCls}-sm`]: size === 'small', }, className); const { antLocale } = this.context; if (antLocale && antLocale.Select) { notFoundContent = ('notFoundContent' in this.props) ? notFoundContent : antLocale.Select.notFoundContent; } if (combobox) { notFoundContent = null; // children 带 dom 结构时,无法填入输入框 optionLabelProp = optionLabelProp || 'value'; } return ( ); } }