FieldMask

Обёртка над FieldText из @cloud-ru/ds-fields с предустановленной маской ввода на react-imask. Маска, плейсхолдер и inputMode выбираются по пропу mask — поле само форматирует ввод и отдаёт значение через onChange(value, mask).

Когда использовать

  • Нужен ввод строго форматированного значения: идентификатор (UUID), код, паспорт, СНИЛС, IPv4-адрес.
  • Хочется готовую маску без ручной настройки react-imask.

Когда не нужен FieldMask:

  • Произвольный текст без формата — FieldText напрямую.
  • Телефон с выбором страны — FieldPhone.

Анатомия

Mask

Предустановленный набор масок (проп mask, константа MASK):

  • uuid — XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX (hex).
  • code — XXXX (числовой код).
  • passport — XXXX XXXXXX.
  • snils — XXXXXX-XXX XX.
  • ip-v4-address — 0[00].0[00].0[00].0[00].
  • ip-v4-address-with-mask — IPv4 с CIDR-суффиксом /NN.

Size (default m)

Размер поля наследуется от FieldText:

  • s — компактный.
  • m — средний.
  • l — крупный.

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

Типы масок

Типы масокРазные предустановленные маски в одном ряду.
tsx
import { FieldMask, MASK } from '@cloud-ru/ds-uikit-product-fields-predefined';

export function FieldMaskMasks() {
  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'flex-start' }}>
      <FieldMask label='UUID' mask={MASK.Uuid} />
      <FieldMask label='СНИЛС' mask={MASK.Snils} />
      <FieldMask label='IPv4' mask={MASK.IpV4Address} />
    </div>
  );
}

Controlled

ControlledКонтролируемое значение через value + onChange.
value: —
tsx
import { FieldMask, MASK } from '@cloud-ru/ds-uikit-product-fields-predefined';
import { useState } from 'react';

export function FieldMaskControlled() {
  const [value, setValue] = useState('');

  return (
    <FieldMask
      label='Код'
      mask={MASK.Code}
      value={value}
      onChange={next => setValue(next)}
      caption={`value: ${value || '—'}`}
    />
  );
}

Props

Types

PropsFieldMaskProps
PropTypeDefaultRequiredDescription
allowMoreThanMaxLengthbooleanfalsenoРазрешить ввод свыше `maxLength` символов (счётчик продолжит расти).
autoCompletestring | booleanfalsenoВключен ли автокомплит для поля
autoFocusbooleanfalsenoВключен ли авто-фокус для поля
backgroundbooleantruenoФон поля (acrylic)
captionstring—noВторичная подпись справа
classNamestring—noCSS-класс CSS-класс корня `FieldDecorator`
data-test-idstring—no
defaultValuestring—noНачальное значение (uncontrolled-режим)
disabledbooleanfalsenoПоле выключено Является ли поле деактивированным
elementAfterFieldElementSlot—noСлот справа (кнопка / селект с опциональным выпадающим списком)
elementBeforeFieldElementSlot—noСлот слева (кнопка / селект с опциональным выпадающим списком)
errorstring—noОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestring—noCSS-класс оболочки поля ввода
hintstring—noПодсказка
iconAfterReactNode—noИконка справа от строки ввода
iconBeforeReactNode—noИконка слева от строки ввода
idstring—noЗначение html-атрибута id
innerRefRef<HTMLDivElement>—noRef на корневой DOM-элемент
innerTestIds{ shell?: string; input?: string; } | undefined—noИдентификаторы внутренних слотов — оболочки и строки ввода. Нужны компонентам, которые рендерят `FieldCombo` под собственным именем (`FieldText`): их e2e адресует свои слоты, а не слоты `FieldCombo`.
labelstring—noЗаголовок
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`
mask"code" | "ip-v4-address" | "ip-v4-address-with-mask" | "passport" | "snils" | "uuid"—yesПредустановленная маска поля
maxnumber—noМаксимальное значение поля
maxLengthnumber—noМаксимальная длина вводимого значения
minnumber—noМинимальное значение поля
namestring—noЗначение html-атрибута name
onBlurFocusEventHandler<HTMLInputElement>—noКолбек обработки потери фокуса
onChange((value: string, mask: InputMask<Record<string, unknown>>) => void)—noКолбек смены значения; вторым аргументом — экземпляр маски imask
onClearButtonClick(() => void)—noКолбек клика по кнопке очистки
onClickMouseEventHandler<HTMLInputElement>—noКолбек обработки клика
onCopyButtonClick(() => void)—noКолбек после копирования значения в буфер
onFocusFocusEventHandler<HTMLInputElement>—noКолбек обработки получения фокуса
onKeyDownKeyboardEventHandler<HTMLInputElement>—noКолбек обработки начала нажатия клавиши клавиатуры
onMouseDownMouseEventHandler<HTMLInputElement>—noКолбек обработки нажатия кнопки мыши
onPasteClipboardEventHandler<HTMLInputElement>—noКолбек обработки вставки значения
outlinebooleantruenoРазделитель между основным полем и слотами `elementBefore` / `elementAfter`
patternstring—noРегулярное выражение валидного инпута
placeholderstring—noЗначение плейсхолдера
postfixReactNode—noПостфикс (текст или нода)
prefixReactNode—noПрефикс (текст или нода)
prefixIconReactNode—noВедущая иконка. @deprecated Используйте `iconBefore` — он приоритетнее, если заданы оба.
readonlybooleanfalsenoТолько для чтения Является ли поле доступным только для чтения
requiredboolean—noПоказать знак обязательности `*`
showClearButtonbooleantruenoПоказывать кнопку очистки значения (как в Search)
showCopyButtonbooleantruenoПоказывать кнопку копирования значения (только при `readonly = true` и непустом `value`)
showHintIconboolean—noОтображение статус-иконки у подсказки (по умолчанию `true`)
size"l" | "m" | "s"mnoРазмер
spellCheckbooleantruenoЗначение атрибута spellcheck (проверка орфографии)
stepstring | number—noМаксимальное значение поля
tabIndexnumber0noЗначение атрибута tab-index
type"email" | "number" | "password" | "tel" | "text" | "url"—noТип инпута
validationState"default" | "error" | "success" | "warning"—noСостояние валидации
valuestring—noЗначение поля (controlled-режим)

Unions

Types

FieldMaskProps

Unions

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

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

<FieldMask mask='uuid' autoFocus layoutPresets={{ mobile: { autoFocus: true } }} />

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

Storybook