FieldName
Поле ввода имени поверх FieldText с предустановленной yup-валидацией: только латиница, цифры, точка, дефис и подчёркивание; длина до 64 символов; по умолчанию обязательное. Лейбл и подпись подставляются из локали. Доступно в двух вариантах: standalone (FieldName, локальный стейт + onValidationError) и FieldNameRHF (интеграция с react-hook-form через Controller).
Когда использовать
- Ввод технического имени сущности (сервис, ресурс, ключ) с ограничением на символы и длину.
- В форме на react-hook-form — вариант
FieldNameRHF.
Когда не нужен FieldName:
- Произвольный текст без правил валидации —
FieldText. - Многострочное описание —
FieldDescription.
Анатомия
Валидация
Встроенная схема (yup):
- символы —
^[a-zA-Z0-9.\-_]*$(иначе ошибка «недопустимые символы»); - длина — до
maxLength(по умолчанию 64), счётчик показывается при ошибке длины; required(по умолчаниюtrue) — ошибка обязательности появляется после blur.
Через customSchema к встроенной схеме конкатенируются дополнительные правила. Так подключают data-зависимые проверки, которые компонент не может выполнить сам — например, уникальность имени по данным потребителя. Текст ошибки для этого случая уже есть в локали пакета (FieldName.errorDuplicate — «Такое название уже существует»):
import { string } from 'yup'
import { fieldsPredefinedLocale } from '@cloud-ru/ds-uikit-product-fields-predefined/locale'
const { t } = fieldsPredefinedLocale.useTranslations()
const uniqueSchema = string().test('unique', t('FieldName.errorDuplicate'), value => !existingNames.includes(value ?? ''))
<FieldName customSchema={uniqueSchema} />
Режимы
FieldName— локальный стейт, ошибка отдаётся черезonValidationError(error).FieldNameRHF—controllerPropsдля react-hook-form; валидация регистрируется какvalidateвController.
Size (default m)
Размер поля наследуется от FieldText: s, m, l.
Примеры использования
Базовый
import { FieldName } from '@cloud-ru/ds-uikit-product-fields-predefined';
import { useState } from 'react';
export function FieldNameBasic() {
const [value, setValue] = useState('');
return <FieldName value={value} onChange={setValue} />;
}React Hook Form
import { Button } from '@cloud-ru/ds-button';
import { FieldNameRHF } from '@cloud-ru/ds-uikit-product-fields-predefined';
import { FormProvider, useForm } from 'react-hook-form';
type FormValues = { serviceName: string };
export function FieldNameRHFExample() {
const methods = useForm<FormValues>({ defaultValues: { serviceName: '' }, mode: 'onBlur' });
return (
<FormProvider {...methods}>
<form
onSubmit={methods.handleSubmit(values => alert(`name: ${values.serviceName}`))}
style={{ display: 'flex', flexDirection: 'column', gap: 12, width: 320 }}
>
<FieldNameRHF controllerProps={{ name: 'serviceName' }} />
<Button type='submit' label='Отправить' />
</form>
</FormProvider>
);
}Props
Types
FieldNameProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
allowMoreThanMaxLength | boolean | false | no | Разрешить ввод свыше `maxLength` символов (счётчик продолжит расти). |
autoComplete | string | boolean | false | no | Включен ли автокомплит для поля |
autoFocus | boolean | false | no | Включен ли авто-фокус для поля |
background | boolean | true | no | Фон поля (acrylic) |
className | string | — | no | CSS-класс CSS-класс корня `FieldDecorator` |
customSchema | StringSchema<string, AnyObject, undefined, ""> | — | no | Дополнительная yup-схема, конкатенируется к встроенной (обязательность, длина, допустимые символы). Через неё подключают data-зависимые проверки, которые компонент не может выполнить сам — например, проверку уникальности имени по данным потребителя. Текст ошибки можно взять из локали пакета: `fieldsPredefinedLocale.useTranslations().t('FieldName.errorDuplicate')`. |
data-test-id | string | — | no | |
defaultValue | string | — | no | Начальное значение (uncontrolled-режим) |
disabled | boolean | false | no | Поле выключено Является ли поле деактивированным |
elementAfter | FieldElementSlot | — | no | Слот справа (кнопка / селект с опциональным выпадающим списком) |
elementBefore | FieldElementSlot | — | no | Слот слева (кнопка / селект с опциональным выпадающим списком) |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля ввода |
iconAfter | ReactNode | — | no | Иконка справа от строки ввода |
iconBefore | ReactNode | — | no | Иконка слева от строки ввода |
id | string | — | no | Значение html-атрибута id |
innerRef | Ref<HTMLDivElement> | — | no | Ref на корневой DOM-элемент |
innerTestIds | { shell?: string; input?: string; } | undefined | — | no | Идентификаторы внутренних слотов — оболочки и строки ввода. Нужны компонентам, которые рендерят `FieldCombo` под собственным именем (`FieldText`): их e2e адресует свои слоты, а не слоты `FieldCombo`. |
labelFor | string | — | no | HTML-атрибут `for` для `<label>` |
labelTooltip | QuestionTooltipProps | — | no | Подсказка (question-tooltip) у заголовка |
layoutPresets | Partial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>> | — | no | Переопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`. |
length | FieldLength | — | no | Счётчик длины `current/max` |
max | number | — | no | Максимальное значение поля |
maxLength | number | — | no | Максимальная длина вводимого значения |
min | number | — | no | Минимальное значение поля |
name | string | — | no | Значение html-атрибута name |
onBlur | FocusEventHandler<HTMLInputElement> | — | no | Колбек обработки потери фокуса |
onChange | ((value: string) => void) | — | no | Колбек смены значения |
onClearButtonClick | (() => void) | — | no | Колбек клика по кнопке очистки |
onClick | MouseEventHandler<HTMLInputElement> | — | no | Колбек обработки клика |
onCopyButtonClick | (() => void) | — | no | Колбек после копирования значения в буфер |
onFocus | FocusEventHandler<HTMLInputElement> | — | no | Колбек обработки получения фокуса |
onKeyDown | KeyboardEventHandler<HTMLInputElement> | — | no | Колбек обработки начала нажатия клавиши клавиатуры |
onMouseDown | MouseEventHandler<HTMLInputElement> | — | no | Колбек обработки нажатия кнопки мыши |
onPaste | ClipboardEventHandler<HTMLInputElement> | — | no | Колбек обработки вставки значения |
onValidationError | ((error: ValidationError | null) => void) | — | no | Колбэк, вызываемый при изменении ошибки валидации |
outline | boolean | true | no | Разделитель между основным полем и слотами `elementBefore` / `elementAfter` |
pattern | string | — | no | Регулярное выражение валидного инпута |
postfix | ReactNode | — | no | Постфикс (текст или нода) |
prefix | ReactNode | — | no | Префикс (текст или нода) |
prefixIcon | ReactNode | — | no | Ведущая иконка. @deprecated Используйте `iconBefore` — он приоритетнее, если заданы оба. |
readonly | boolean | false | no | Только для чтения Является ли поле доступным только для чтения |
required | boolean | — | no | Показать знак обязательности `*` |
showClearButton | boolean | true | no | Показывать кнопку очистки значения (как в Search) |
showCopyButton | boolean | true | no | Показывать кнопку копирования значения (только при `readonly = true` и непустом `value`) |
showHintIcon | boolean | — | no | Отображение статус-иконки у подсказки (по умолчанию `true`) |
showLabel | boolean | — | no | Показывать предустановленный лейбл «Имя» |
size | "l" | "m" | "s" | — | no | Размер |
spellCheck | boolean | true | no | Значение атрибута spellcheck (проверка орфографии) |
step | string | number | — | no | Максимальное значение поля |
tabIndex | number | 0 | no | Значение атрибута tab-index |
validationState | "default" | "error" | "success" | "warning" | — | no | Состояние валидации |
value | string | — | no | Значение поля (controlled-режим) |
Types
FieldNameProps
Related props
FieldElementButtonProps
FieldElementSlot
FieldLayoutPresets
FieldLength
QuestionTooltipProps
Size
ValidationState
Адаптивность
autoFocus на mobile выключается (наследуется из @cloud-ru/ds-fields) — автофокус там открывает экранную клавиатуру без действия пользователя. Раскладка читается из AdaptiveProvider (@cloud-ru/ds-adaptive); отдельного пропа layoutType нет. Вернуть автофокус на mobile — пропом layoutPresets:
<FieldName autoFocus layoutPresets={{ mobile: { autoFocus: true } }} />
size от раскладки не зависит — задаётся пропом (по умолчанию m) одинаково на всех раскладках.