Skip to content

CdsFileInput

New in v4.0

Поле выбора файлов: пользователь прикладывает документы кликом, перетаскиванием или вставкой из буфера обмена. Вокруг нативного input type="file" компонент собирает всё, что нужно форме: лейбл, описание, сообщения, счётчик, очистку и фильтр по типам файлов.

Storybook GitLab
Покрытие тестами: 100% — хорошее покрытие
API в спеках
81 / 81 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
106 юнит · 4 браузерных
Известные баги
11 зафиксированы тестом it.fails
Покрытие кода
100% строк · 92.1% ветвей замер v4.0.0-alpha.13
A11y (axe)
11 рекомендаций в 12 историях замер v4.0.0-alpha.11

Нужна заметная зона загрузки со списком файлов — возьмите CdsFileUpload; за отправку файлов на сервер отвечает CdsUploader.

Анатомия ​

Компонент построен на той же базе, что и CdsTextInput: лейбл, описание, сообщения, валидация и цвета работают одинаково. Своё у поля — иконка загрузки слева (prepend-icon, по умолчанию upload), имена выбранных файлов вместо вводимого текста и счётчик файлов в нижнем блоке. Очистка (clearable) включена из коробки.

Вариации ​

Лейбл и подсказки ​

label называет поле, в description помещаются требования к файлам, placeholder подсказывает, что файл можно перетащить в поле. Выбранный файл отображается своим именем.

Sandbox Storybook

Несколько файлов ​

Свойство multiple разрешает выбрать сразу несколько файлов — их имена перечисляются через запятую.

Sandbox Storybook

Отображение тегами ​

Свойство chips показывает каждый файл отдельным тегом (CdsTag) — список из нескольких файлов читается легче.

Sandbox Storybook

Размер и счётчик ​

show-size добавляет к имени файла его размер, counter выводит количество и суммарный размер под полем. Длинные имена усекаются посередине — порог задаёт truncate-length (по умолчанию 22 символа).

Sandbox Storybook

Фильтр по типам ​

filter-by-type принимает MIME-типы, wildcard-типы и расширения через запятую (image/*,.pdf). Неподходящие файлы не попадают в модель — о них сообщает событие rejected: покажите пользователю, что именно отклонено и почему.

Sandbox Storybook

Состояния ​

disabled блокирует поле, readonly даёт посмотреть выбранное, но не изменить, loading показывает индикатор — например, пока файлы уходят на сервер.

Sandbox Storybook

Слоты ​

Зоны поля совпадают с CdsTextInput: prepend / append снаружи рамки, prepend-inner / append-inner внутри. Дополнительный слот selection заменяет стандартный список имён файлов.

Имя слотаОписание
labelСодержимое лейбла (замещает label)
descriptionСодержимое описания (замещает description)
prependЭлемент до поля (замещает иконку загрузки)
appendЭлемент после поля
prepend-innerЭлемент в начале поля, внутри рамки
append-innerЭлемент в конце поля, внутри рамки
selectionСвоё отображение выбранных файлов
clearСвоя иконка очистки (при clearable)
loaderСвой индикатор загрузки (при loading)
counterСодержимое счётчика
detailsНижний блок целиком — сообщения и счётчик
messagesСодержимое блока сообщений

В слот selection приходят усечённые имена файлов (fileNames) и суммарный размер (totalBytes, totalBytesReadable).

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Отправка формы с вложениями ​

Поле участвует в валидации CdsForm наравне с остальными: rules получают выбранные файлы — проверьте, что вложения приложены и не превышают лимит размера, до отправки на сервер. chips и counter помогают пользователю следить за списком.

Sandbox Storybook

Кнопка загрузки без поля ​

Свойство hide-input скрывает поле, оставляя только кликабельную иконку — удобно встроить загрузку в тулбар или строку комментария. Выбранные файлы показывайте рядом сами: здесь — тегами с closable, клик по крестику убирает файл из модели.

Sandbox Storybook

Превью изображения ​

filter-by-type="image/*" пропускает только картинки, а превью строится из значения модели через URL.createObjectURL. Не забывайте освобождать предыдущий URL — иначе выбранные файлы копятся в памяти вкладки.

Sandbox Storybook

API ​

Пропсы

ИмяТипПо умолчаниюОписание
activeboolean | undefined—Активное состояние поля
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendIconIconValue | undefined—Иконка в слоте append после контента
appendInnerIconIconValue | undefined—Иконка во внутреннем слоте append после содержимого поля
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
centerAffixboolean | undefined—Выровнять по вертикали элементы appendInner, prependInner, clearIcon и label по центру.
chipsboolean | undefined—Отображать выбранные файлы в виде тегов (CdsTag) вместо списка имён.
clearableboolean | undefinedtrueОтображать кнопку очистки значения
clearIconIconValue | undefined'remove'Иконка кнопки очистки
colorstring | undefined—Цвет компонента
counterboolean | undefined—Отображать счётчик количества (и, при showSize, суммарного размера) выбранных файлов.
counterSizeStringstring | undefined'$cds.fileInput.counterSize'Ключ локализации для текста счётчика с размером файлов.
counterStringstring | undefined'$cds.fileInput.counter'Ключ локализации для текста счётчика количества файлов.
descriptionstring | undefined—Описание компонента, отображаемое под меткой
dirtyboolean | undefined—Признак того, что значение поля было изменено пользователем
disabledboolean | null | undefinednullЗаблокированное состояние
errorboolean | undefined—Состояние ошибки
errorMessagesstring | readonly string[] | null | undefined[]Отображает компонент в состояние ошибки и передает пользовательские сообщения об ошибках. Будет объединяться с любыми проверками, заданными в свойстве rules. Это поле не запускает валидацию.
filterByTypestring | undefined—Фильтрация файлов по MIME-типу или расширению (например image/*,.pdf). Отклонённые файлы не попадают в модель.
focusedboolean | undefined—Управляет состоянием фокуса компонента. Когда true, компонент считается сфокусированным и может применять соответствующие стили или поведение.
hideDetailsboolean | "auto" | undefined—Скрытие блока с деталями (сообщениями и подсказками). При значении 'auto' блок скрывается, если нет сообщений
hideInputboolean | undefined—Скрыть поле ввода, оставив только иконку prepend (например, для использования как кнопки).
hideMessagesboolean | undefined—Скрыть сообщения под полем ввода
hintstring | undefined—Текст подсказки, отображаемый под полем ввода
iconColorstring | boolean | undefined—Цвет иконки. Принимает булево значение или строку с цветом
idstring | undefined—Уникальный идентификатор компонента
labelstring | undefined—Текст метки (label) компонента
loadingstring | boolean | undefined—Индикатор загрузки для компонента
maxErrorsstring | number | undefined1Максимальное число отображаемых ошибок при валидации
maxWidthstring | number | undefined—Максимальная ширина компонента
messagesstring | readonly string[] | undefined[]Сообщения для отображения под полем ввода
minWidthstring | number | undefined—Минимальная ширина компонента
modelValueFile | File[] | null | undefined(props) => props.multiple ? [] : nullЗначение модели: массив файлов (при multiple), один файл или null.
multipleboolean | undefined—Разрешить выбор нескольких файлов.
namestring | undefined—Имя поля ввода
persistentClearableboolean | undefined—Всегда отображать кнопку очистки, а не только при наведении или фокусе
persistentHintboolean | undefined—Всегда отображать подсказку, а не только при фокусе
placeholderstring | undefined—Текст-заполнитель, отображаемый в пустом поле (когда файлы ещё не выбраны).
prependIconIconValue | undefined'upload'Иконка в слоте prepend перед контентом
prependInnerIconIconValue | undefined—Иконка во внутреннем слоте prepend перед содержимым поля
readonlyboolean | null | undefinednullТолько для чтения
reverseboolean | undefined—Обратный порядок расположения элементов внутри поля
rulesreadonly ValidationRule[] | undefined[]Принимает массив, состоящий из элементов различных типов: функций, логических значений и строк. Функции принимают входное значение в качестве аргумента и должны возвращать либо true / false, либо строку, содержащую сообщение об ошибке. Поле ввода перейдет в состояние ошибки, если функция возвращает значение false (или любое значение в массиве содержит false) либо является строкой.
showSizeboolean | 1000 | 1024 | undefinedfalseОтображать размер выбранных файлов. Булево значение или основание счисления: 1000 (kB) или 1024 (KiB).
sizenumber | "xs" | "sm" | "md" | "lg" | "xl" | undefined'md'Размер компонента
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
truncateLengthstring | number | undefined22Максимальная длина имени файла до усечения (символы в начале и конце сохраняются).
validateOnValidateOn | undefined—Изменяет тип события, при котором запускается валидация
validationValueany—Значение, используемое при применении правил валидации
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
click:control[e: MouseEvent]Событие, возникающее при клике в основной области контрола.
mousedown:control[e: MouseEvent]Событие, которое срабатывает при нажатии кнопки мыши в основной области контрола.
rejected[files: File[]]Событие, которое срабатывает, когда часть файлов отклонена фильтром filterByType.
update:focused[focused: boolean]Вызывается при переходе фокуса на элемент или при его потере.
update:modelValue[value: File | File[]]Событие, которое срабатывает при изменении списка выбранных файлов.

Слоты

ИмяТипОписание
appendCdsInputSlotДобавляет элемент после поля ввода
append-innerCdsInputDefaultSlotСлот, добавляемый в конце инпута ввода
clearCdsInputDefaultSlot & { props: Record<string, any>; }Слот для пользовательского иконки очистки (отображается, когда свойство clearable имеет значение «true»).
counterCdsCounterSlotСлот для ввода пользовательского счётчика.
description{ description: string | undefined; props: Record<string, any>; }Слот по умолчанию для компонента CdsDescription
detailsCdsInputSlotСлот для ввода пользовательских данных, позволяющее настраивать отображение сообщений
label{ label: string | undefined; props: Record<string, any>; }Слот по умолчанию для компонента CdsLabel
loaderLoaderSlotPropsСлот для пользовательского загрузчика (отображается, если свойство loading имеет значение true).
messageCdsMessageSlotСлот для настройки содержания сообщения
messagesCdsInputSlotСлот для ввода пользовательских данных, позволяющее настраивать отображение сообщений
prependCdsInputSlotДобавляет элемент до поля ввода
prepend-innerCdsInputDefaultSlotСлот, добавляемый в начало инпута ввода
selectionCdsFileInputSelectionSlotСлот для кастомного отображения выбранных файлов.

Exposed

ИмяТипОписание
controlRefHTMLElement | undefinedRef-ссылка на контролл поля ввода
fieldIconColorstring | undefinedЦвет иконки
isDirtybooleanЯвляется ли поле ввода "грязным"
isDisabledbooleanЯвляется ли поле ввода заблокированным
isPurebooleanЯвляется ли поле ввода "чистым"
isReadonlybooleanЯвляется ли поле ввода только для чтения
isValidboolean | nullЯвляется ли поле ввода валидным
isValidatingbooleanЯвляется ли поле ввода в процессе валидации
reset() => Promise<void>Функция сброса поля ввода в исходное состояние
resetValidation() => Promise<void>Функция сброса валидации поля ввода
validate(silent?: boolean) => Promise<string[]>Функция валидации поля ввода