FieldPhone
Телефонное поле поверх FieldText. В ведущем слоте — селектор страны (AdaptiveDroplist из @cloud-ru/ds-list) с флагом и кодом; маска ввода динамически подстраивается под выбранную страну. При вставке номера из буфера страна определяется автоматически (awesome-phonenumber).
Когда использовать
- Ввод телефона с международным выбором страны.
- Нужен авто-детект страны по вставленному номеру и маскирование под формат страны.
Когда не нужен FieldPhone:
- Произвольный форматированный ввод без телефона —
FieldMask.
Анатомия
Селектор страны
Ведущий слот (elementBefore) — флаг выбранной страны + код (+7, +1, …). Клик открывает AdaptiveDroplist со списком стран и поиском. Если доступна одна страна — селектор скрывается, остаётся только код в префиксе.
Mask
Маска ввода определяется выбранной страной (country.mask) и меняется при смене страны. Префикс с кодом страны добавляется к итоговому значению.
options — настройка списка стран
Проп options (CountrySettings) ограничивает или переопределяет список (взаимоисключающие поля):
includedCountries— оставить только перечисленные страны.excludedCountries— исключить перечисленные из встроенного списка.overriddenOptions— полностью заменить список собственными опциями.
Size (default m)
Размер поля наследуется от FieldText: s, m, l.
Примеры использования
Базовый
import { PortalContextProvider } from '@cloud-ru/ds-portal-context';
import { FieldPhone } from '@cloud-ru/ds-uikit-product-fields-predefined';
import { useRef, useState } from 'react';
export function FieldPhoneBasic() {
const hostRef = useRef<HTMLDivElement>(null);
const [value, setValue] = useState('');
return (
<PortalContextProvider root={hostRef}>
<div ref={hostRef} style={{ position: 'relative', width: 320 }}>
<FieldPhone label='Телефон' value={value} onChange={setValue} searchPlaceholder='Поиск страны' />
</div>
</PortalContextProvider>
);
}Ограниченный список стран
import { PortalContextProvider } from '@cloud-ru/ds-portal-context';
import {
ARMENIA_COUNTRY_CODE,
BELARUS_COUNTRY_CODE,
FieldPhone,
KAZAKHSTAN_COUNTRY_CODE,
RUSSIA_COUNTRY_CODE,
} from '@cloud-ru/ds-uikit-product-fields-predefined';
import { useRef, useState } from 'react';
export function FieldPhoneCountrySettings() {
const hostRef = useRef<HTMLDivElement>(null);
const [value, setValue] = useState('');
return (
<PortalContextProvider root={hostRef}>
<div ref={hostRef} style={{ position: 'relative', width: 320 }}>
<FieldPhone
label='Телефон (СНГ)'
value={value}
onChange={setValue}
options={{
includedCountries: [
RUSSIA_COUNTRY_CODE,
BELARUS_COUNTRY_CODE,
KAZAKHSTAN_COUNTRY_CODE,
ARMENIA_COUNTRY_CODE,
],
}}
/>
</div>
</PortalContextProvider>
);
}Props
Types
FieldPhoneProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
autoComplete | string | boolean | false | no | Включен ли автокомплит для поля |
autoFocus | boolean | false | no | Включен ли авто-фокус для поля |
background | boolean | true | no | Фон поля (acrylic) |
caption | string | — | no | Вторичная подпись справа |
className | string | — | no | CSS-класс CSS-класс корня `FieldDecorator` |
data-test-id | string | — | no | |
defaultValue | string | — | no | Начальное значение (uncontrolled-режим) |
disabled | boolean | false | no | Поле выключено Является ли поле деактивированным |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля ввода |
hint | string | — | no | Подсказка |
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`. |
label | string | — | no | Заголовок |
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) & ((value: string) => void)) | — | no | Колбек смены значения |
onChangeCountry | ((country: FieldPhoneOptionsProps) => 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 | Колбек обработки вставки значения |
options | CountrySettings | — | no | Конфигурация для изменения стандартного списка стран |
outline | boolean | true | no | Разделитель между основным полем и слотами `elementBefore` / `elementAfter` |
pattern | string | — | no | Регулярное выражение валидного инпута |
readonly | boolean | false | no | Только для чтения Является ли поле доступным только для чтения |
required | boolean | — | no | Показать знак обязательности `*` |
scrollList | boolean | — | no | Скролл с ограничением высоты для списка стран. По умолчанию включён. |
searchPlaceholder | string | — | no | Плейсхолдер поля поиска в выпадающем списке стран |
showClearButton | boolean | true | no | Показывать кнопку очистки значения (как в Search) |
showCopyButton | boolean | true | no | Показывать кнопку копирования значения (только при `readonly = true` и непустом `value`) |
showHintIcon | boolean | — | no | Отображение статус-иконки у подсказки (по умолчанию `true`) |
size | "l" | "m" | "s" | — | no | Размер |
spellCheck | boolean | true | no | Значение атрибута spellcheck (прове рка орфографии) |
step | string | number | — | no | Максимальное значение поля |
tabIndex | number | 0 | no | Значение атрибута tab-index |
type | "email" | "number" | "password" | "tel" | "text" | "url" | — | no | Тип инпута |
validationState | "default" | "error" | "success" | "warning" | — | no | Состояние валидации |
value | string | — | no | Значение поля (controlled-режим) |
Types
FieldPhoneProps
CountrySettings
Related props
FieldLayoutPresets
FieldLength
QuestionTooltipProps
Size
Type
ValidationState
Адаптивность
Выбор страны — адаптивный Droplist из @cloud-ru/ds-list: на desktop анкорный popover, на mobile — список в BottomSheet. Раскладку даёт AdaptiveProvider (@cloud-ru/ds-adaptive); отдельного пропа layoutType нет.
autoFocus на mobile выключается (наследуется из @cloud-ru/ds-fields) — вернуть можно пропом layoutPresets={{ mobile: { autoFocus: true } }}.