| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 | /* eslint-disable max-len */import React from 'react';import cls from 'classnames';import PropTypes from 'prop-types';import { cssClasses, strings } from '@douyinfe/semi-foundation/input/constants';import BaseComponent from '../_base/baseComponent';import Label, { LabelProps } from '../form/label';import { noop } from '@douyinfe/semi-foundation/utils/function';import { get, isFunction } from 'lodash';const prefixCls = cssClasses.PREFIX;const sizeSet = strings.SIZE;export type InputSize = 'small' | 'large' | 'default';export interface InputGroupProps {    className?: string;    children?: React.ReactNode;    size?: InputSize;    style?: Record<string, any>;    onBlur?: (e: React.FocusEvent<HTMLSpanElement>) => void;    onFocus?: (e: React.FocusEvent<HTMLSpanElement>) => void;    label?: LabelProps;    labelPosition?: string;    disabled?: boolean;}// eslint-disable-next-lineexport interface InputGroupState {} export default class inputGroup extends BaseComponent<InputGroupProps, InputGroupState> {    static propTypes = {        className: PropTypes.string,        children: PropTypes.node,        size: PropTypes.oneOf(sizeSet),        style: PropTypes.object,        onBlur: PropTypes.func,        onFocus: PropTypes.func,        label: PropTypes.object,        labelPosition: PropTypes.string,    };    static defaultProps = {        size: 'default',        className: '',        onBlur: noop,        onFocus: noop,    };    renderGroupWithLabel(inner: React.ReactNode) {        // eslint-disable-next-line no-unused-vars        const { size, className, label, labelPosition, ...rest } = this.props;        const groupWrapperCls = cls({            [`${prefixCls}-group-wrapper`]: true,            [`${prefixCls}-group-wrapper-with-top-label`]: labelPosition === 'top',            [`${prefixCls}-group-wrapper-with-left-label`]: labelPosition === 'left',        });        const groupCls = cls(            `${prefixCls}-group`,            className,            {                [`${prefixCls}-${size}`]: size !== 'default',            }        );        // const labelCls = cls(label.className, '');        const defaultName = 'input-group';        return (            <div className={groupWrapperCls}>                {label && label.text ? <Label name={defaultName} {...label} /> : null}                <span                    role="group"                    aria-disabled={this.props.disabled}                    id={label && label.name || defaultName}                    className={groupCls}                    style={this.props.style}                    onFocus={this.props.onFocus}                    onBlur={this.props.onBlur}                >                    {inner}                </span>            </div>        );    }    render() {        const { size, style, className, children, label, onBlur: groupOnBlur, onFocus: groupOnFocus, disabled: groupDisabled, ...rest } = this.props;        const groupCls = cls(            `${prefixCls}-group`,            {                [`${prefixCls}-${size}`]: size !== 'default',            },            className        );        let inner;        if (children) {            inner = (Array.isArray(children) ? children : [children]).map((item, index) => {                if (item) {                    const { onBlur: itemOnBlur, onFocus: itemOnFocus, disabled: itemDisabled } = (item as any).props;                    const onBlur = isFunction(itemOnBlur) && get(itemOnBlur, 'name') !== 'noop'  ? itemOnBlur : groupOnBlur;                    const onFocus = isFunction(itemOnFocus) && get(itemOnFocus, 'name') !== 'noop' ? itemOnFocus : groupOnFocus;                    const disabled = typeof itemDisabled === 'boolean' ? itemDisabled : groupDisabled;                    return React.cloneElement(item as any, { key: index, ...rest, size, onBlur, onFocus, disabled });                }                return null;            });        }        if (label && label.text) {            return this.renderGroupWithLabel(inner);        }        return (            <span                role="group"                aria-label="Input group"                aria-disabled={this.props.disabled}                className={groupCls}                style={style}                onFocus={this.props.onFocus}                onBlur={this.props.onBlur}            >                {inner}            </span>        );    }}
 |