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.

Примеры использования

Базовый

БазовыйStandalone-режим с локальным стейтом и валидацией.
tsx
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

React Hook FormFieldNameRHF внутри FormProvider.
tsx
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

PropsFieldNameProps
PropTypeDefaultRequiredDescription
allowMoreThanMaxLengthbooleanfalsenoРазрешить ввод свыше `maxLength` символов (счётчик продолжит расти).
autoCompletestring | booleanfalsenoВключен ли автокомплит для поля
autoFocusbooleanfalsenoВключен ли авто-фокус для поля
backgroundbooleantruenoФон поля (acrylic)
classNamestring—noCSS-класс CSS-класс корня `FieldDecorator`
customSchemaStringSchema<string, AnyObject, undefined, "">—noДополнительная yup-схема, конкатенируется к встроенной (обязательность, длина, допустимые символы). Через неё подключают data-зависимые проверки, которые компонент не может выполнить сам — например, проверку уникальности имени по данным потребителя. Текст ошибки можно взять из локали пакета: `fieldsPredefinedLocale.useTranslations().t('FieldName.errorDuplicate')`.
data-test-idstring—no
defaultValuestring—noНачальное значение (uncontrolled-режим)
disabledbooleanfalsenoПоле выключено Является ли поле деактивированным
elementAfterFieldElementSlot—noСлот справа (кнопка / селект с опциональным выпадающим списком)
elementBeforeFieldElementSlot—noСлот слева (кнопка / селект с опциональным выпадающим списком)
errorstring—noОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestring—noCSS-класс оболочки поля ввода
iconAfterReactNode—noИконка справа от строки ввода
iconBeforeReactNode—noИконка слева от строки ввода
idstring—noЗначение html-атрибута id
innerRefRef<HTMLDivElement>—noRef на корневой DOM-элемент
innerTestIds{ shell?: string; input?: string; } | undefined—noИдентификаторы внутренних слотов — оболочки и строки ввода. Нужны компонентам, которые рендерят `FieldCombo` под собственным именем (`FieldText`): их e2e адресует свои слоты, а не слоты `FieldCombo`.
labelForstring—noHTML-атрибут `for` для `<label>`
labelTooltipQuestionTooltipProps—noПодсказка (question-tooltip) у заголовка
layoutPresetsPartial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>>—noПереопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
lengthFieldLength—noСчётчик длины `current/max`
maxnumber—noМаксимальное значение поля
maxLengthnumber—noМаксимальная длина вводимого значения
minnumber—noМинимальное значение поля
namestring—noЗначение html-атрибута name
onBlurFocusEventHandler<HTMLInputElement>—noКолбек обработки потери фокуса
onChange((value: string) => void)—noКолбек смены значения
onClearButtonClick(() => void)—noКолбек клика по кнопке очистки
onClickMouseEventHandler<HTMLInputElement>—noКолбек обработки клика
onCopyButtonClick(() => void)—noКолбек после копирования значения в буфер
onFocusFocusEventHandler<HTMLInputElement>—noКолбек обработки получения фокуса
onKeyDownKeyboardEventHandler<HTMLInputElement>—noКолбек обработки начала нажатия клавиши клавиатуры
onMouseDownMouseEventHandler<HTMLInputElement>—noКолбек обработки нажатия кнопки мыши
onPasteClipboardEventHandler<HTMLInputElement>—noКолбек обработки вставки значения
onValidationError((error: ValidationError | null) => void)—noКолбэк, вызываемый при изменении ошибки валидации
outlinebooleantruenoРазделитель между основным полем и слотами `elementBefore` / `elementAfter`
patternstring—noРегулярное выражение валидного инпута
postfixReactNode—noПостфикс (текст или нода)
prefixReactNode—noПрефикс (текст или нода)
prefixIconReactNode—noВедущая иконка. @deprecated Используйте `iconBefore` — он приоритетнее, если заданы оба.
readonlybooleanfalsenoТолько для чтения Является ли поле доступным только для чтения
requiredboolean—noПоказать знак обязательности `*`
showClearButtonbooleantruenoПоказывать кнопку очистки значения (как в Search)
showCopyButtonbooleantruenoПоказывать кнопку копирования значения (только при `readonly = true` и непустом `value`)
showHintIconboolean—noОтображение статус-иконки у подсказки (по умолчанию `true`)
showLabelboolean—noПоказывать предустановленный лейбл «Имя»
size"l" | "m" | "s"—noРазмер
spellCheckbooleantruenoЗначение атрибута spellcheck (проверка орфографии)
stepstring | number—noМаксимальное значение поля
tabIndexnumber0noЗначение атрибута tab-index
validationState"default" | "error" | "success" | "warning"—noСостояние валидации
valuestring—noЗначение поля (controlled-режим)

Types

FieldNameProps

Адаптивность

autoFocus на mobile выключается (наследуется из @cloud-ru/ds-fields) — автофокус там открывает экранную клавиатуру без действия пользователя. Раскладка читается из AdaptiveProvider (@cloud-ru/ds-adaptive); отдельного пропа layoutType нет. Вернуть автофокус на mobile — пропом layoutPresets:

<FieldName autoFocus layoutPresets={{ mobile: { autoFocus: true } }} />

size от раскладки не зависит — задаётся пропом (по умолчанию m) одинаково на всех раскладках.

Storybook