import * as React from 'react'; import classNames from 'classnames'; import Input, { InputProps } from './Input'; import Icon from '../icon'; import Button from '../button'; import { ConfigConsumer, ConfigConsumerProps } from '../config-provider'; export interface SearchProps extends InputProps { inputPrefixCls?: string; onSearch?: ( value: string, event?: React.MouseEvent | React.KeyboardEvent, ) => void; enterButton?: boolean | React.ReactNode; } export default class Search extends React.Component { static defaultProps = { enterButton: false, }; private input: Input; saveInput = (node: Input) => { this.input = node; }; onSearch = (e: React.MouseEvent | React.KeyboardEvent) => { const { onSearch } = this.props; if (onSearch) { onSearch(this.input.input.value, e); } this.input.focus(); }; focus() { this.input.focus(); } blur() { this.input.blur(); } renderSuffix = (prefixCls: string) => { const { suffix, enterButton } = this.props; if (enterButton) return suffix; const node = ( ); if (suffix) { let cloneSuffix = suffix; if (React.isValidElement(cloneSuffix) && !cloneSuffix.key) { cloneSuffix = React.cloneElement(cloneSuffix, { key: 'originSuffix', }); } return [cloneSuffix, node]; } return node; }; renderAddonAfter = (prefixCls: string) => { const { enterButton, size, disabled, addonAfter } = this.props; if (!enterButton) return addonAfter; const btnClassName = `${prefixCls}-button`; let button: React.ReactNode; const enterButtonAsElement = enterButton as React.ReactElement; if (enterButtonAsElement.type === Button || enterButtonAsElement.type === 'button') { button = React.cloneElement(enterButtonAsElement, { onClick: this.onSearch, key: 'enterButton', ...(enterButtonAsElement.type === Button ? { className: btnClassName, size, } : {}), }); } else { button = ( ); } if (addonAfter) { return [button, addonAfter]; } return button; }; renderSearch = ({ getPrefixCls }: ConfigConsumerProps) => { const { prefixCls: customizePrefixCls, inputPrefixCls: customizeInputPrefixCls, size, enterButton, className, ...restProps } = this.props; delete (restProps as any).onSearch; const prefixCls = getPrefixCls('input-search', customizePrefixCls); const inputPrefixCls = getPrefixCls('input', customizeInputPrefixCls); let inputClassName; if (enterButton) { inputClassName = classNames(prefixCls, className, { [`${prefixCls}-enter-button`]: !!enterButton, [`${prefixCls}-${size}`]: !!size, }); } else { inputClassName = classNames(prefixCls, className); } return ( ); }; render() { return {this.renderSearch}; } }