/
kaws
/
ui-kit-ce
Обзор
Документация
Войти
/
kaws
/
ui-kit-ce
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
packages/input/src/Input.tsx
185 строк
5 KB
Владислав Полюхов
feat(date-picker): добавлены свойства canClear и showClearIconOnHover
28 окт 2025, 16:09
28 окт 2025, 16:09
de1960a
Код
Авторство
О чём код?
'use client' import * as React from 'react' import { createUseStyles, clsx } from '@v-uik/theme' import { useClassList, useUncontrolledValue } from '@v-uik/hooks' import { Labelled, LabelledProps } from '@v-uik/labelled' import { ElementSize, ClearButtonProps } from '@v-uik/common' import { InputBase, InputBaseProps } from './InputBase' import { getTextLength as formatCountBuiltin } from '@v-uik/utils' import { Classes } from './classes' export interface InputProps<TCanClear extends boolean | unknown = false> extends Omit<InputBaseProps<TCanClear>, 'onFocusChange'>, Omit<LabelledProps, 'children' | 'classes'> { /** * Список классов. * * @inner */ classes?: Partial<Classes> & Partial<ClearButtonProps['classes']> /** * Список классов для компонента Labelled. * * @inner */ labelledClasses?: LabelledProps['classes'] /** * Показывать ли счетчик введенных символов. * * @inner */ showCount?: boolean /** * Функция для форматирования счетчика введенных символов. * * @param {React.ReactText | null} value Значение поля. * @param {number} maxLength Максимально возможное количество символов для отображения. * * @returns {string} Форматированная строка для отображения счетчика введенных символов. */ formatCount?: (value?: React.ReactText | null, maxLength?: number) => string } const useStyles = createUseStyles({ container: { display: 'inline-block', }, fullWidth: { width: '100%', }, }) const _Input = React.forwardRef( <TCanClear extends boolean | unknown = false>( { classes, className, label, labelProps, value: valueProp, onChange, placeholder, inputProps, inputRef: inputRefProp, helperText, helperTextProps, fullWidth, disabled, error, size = ElementSize.md, prefix, suffix, showErrorIcon = true, errorIconTooltipProps, showCount, labelledClasses, description, keepHelperTextMinHeight, required, clearIcon, onClear, canClear = false, showClearIconOnHover, clearButtonInnerProps, ellipsis, defaultValue, formatCount = formatCountBuiltin, ...rest }: InputProps<TCanClear>, ref: React.Ref<HTMLDivElement> ) => { const [focused, setFocused] = React.useState(false) const { handleChange, value } = useUncontrolledValue({ defaultValue, onChange, value: valueProp, }) const classesList = useStyles() const classesMap = useClassList(classesList, classes) const containerClassName = clsx(classesMap.container, className, { [classesMap.fullWidth]: fullWidth, [classesMap?.disabled ?? '']: disabled, [classesMap?.error ?? '']: error, [classesMap?.focused ?? '']: focused, [classesMap?.small ?? '']: size === ElementSize.sm, [classesMap?.medium ?? '']: size === ElementSize.md, [classesMap?.large ?? '']: size === ElementSize.lg, }) const inputBaseClasses = classes ? { root: classesMap?.inputContainer, input: classesMap?.input, inputSmall: classesMap?.inputSmall, inputMedium: classesMap?.inputMedium, inputLarge: classesMap?.inputLarge, prefix: classesMap?.prefix, suffix: classesMap?.suffix, clearButton: classesMap?.clearButton, inputClear: classesMap?.inputClear, } : undefined const labelSuffix = React.useMemo(() => { return showCount ? formatCount(value, inputProps?.maxLength) : undefined }, [showCount, value, inputProps?.maxLength, formatCount]) return ( <div {...rest} ref={ref} className={containerClassName}> <Labelled size={size} classes={labelledClasses} label={label || showCount} helperText={helperText} description={description} keepHelperTextMinHeight={keepHelperTextMinHeight} required={required} disabled={disabled} labelProps={{ ...labelProps, suffix: labelSuffix, }} error={error} helperTextProps={helperTextProps} > <InputBase classes={inputBaseClasses} prefix={prefix} suffix={suffix} inputRef={inputRefProp} inputProps={inputProps} disabled={disabled} placeholder={placeholder} size={size} fullWidth={fullWidth} error={error} showErrorIcon={showErrorIcon} errorIconTooltipProps={errorIconTooltipProps} value={value} clearIcon={clearIcon} canClear={canClear} showClearIconOnHover={showClearIconOnHover} clearButtonInnerProps={clearButtonInnerProps} ellipsis={ellipsis} onChange={handleChange} onFocusChange={setFocused} onClear={onClear} /> </Labelled> </div> ) } ) export const Input = _Input as <TCanClear extends boolean | unknown = false>( props: InputProps<TCanClear> & { /** * */ ref?: React.Ref<HTMLDivElement> } ) => React.ReactElement