Skip to content

CdsFileUpload

New in v4.0

Зона загрузки файлов: принимает файлы перетаскиванием, вставкой из буфера обмена и через системный диалог, а выбранное показывает списком с превью изображений. Вокруг зоны компонент собирает всё, что нужно форме: лейбл, описание, сообщения и валидацию.

Storybook GitLab
Покрытие тестами: 99% — хорошее покрытие
API в спеках
214 / 214 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
149 юнит · 7 браузерных · 9 в планах
Известные баги
18 зафиксированы тестом it.fails
Покрытие кода
99% строк · 90.9% ветвей замер v4.0.0-alpha.13
A11y (axe)
16 рекомендаций в 13 историях замер v4.0.0-alpha.11

Для компактного поля выбора файлов в строке формы используйте CdsFileInput, за отправку файлов на сервер отвечает CdsUploader.

Анатомия ​

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

Вариации ​

Выбор файлов ​

Базовый случай — один файл: перетащите его в зону, вставьте из буфера обмена или выберите кнопкой. Повторный выбор заменяет файл.

Sandbox Storybook

Свойство multiple разрешает выбрать несколько файлов — они копятся списком под зоной. clearable добавляет каждому кнопку удаления, show-size — размер.

Sandbox Storybook

Тексты и иконка ​

Все надписи зоны настраиваются: title — заголовок, subtitle — строка с требованиями к файлам (видна при size md и lg), browse-text — текст кнопки, divider-text — разделитель, icon — иконка в центре зоны.

Sandbox Storybook

Размеры ​

Свойство size управляет плотностью зоны: md — по умолчанию, lg добавляет воздуха, а sm сжимает зону до компактной строки — кнопка выбора скрывается, кликабельной становится вся область.

Sandbox Storybook

Компоновка ​

inset-file-list переносит список выбранных файлов внутрь зоны — компонент не разрастается вниз при добавлении файлов. hide-browse убирает кнопку выбора: зона кликабельна целиком, но подскажите это заголовком.

Sandbox Storybook

Состояния ​

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

Sandbox Storybook

Фильтрация по типу ​

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

Sandbox Storybook

Слоты ​

Части зоны заменяются одноимёнными слотами, а item перерисовывает каждый файл в списке: внутри доступен CdsFileUploadItem — пропсы файла он получает автоматически, достаточно передать обработчики из аргументов слота.

Имя слотаОписание
title / icon / dividerЗаголовок, иконка и разделитель зоны
browseКнопка выбора файлов (в props — обработчик клика)
itemЭлемент списка выбранных файлов
singleЕдинственный файл при inset-file-list без multiple
defaultСвоя зона загрузки целиком
inputНативный input type="file" для ручного размещения
loaderСвой индикатор загрузки (при loading)
label / description / messagesТексты каркаса — как у остальных полей формы
Sandbox Storybook

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

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

Отклик на вакансию ​

Компонент участвует в валидации CdsForm наравне с остальными полями: rules получают выбранные файлы. Здесь резюме обязательно и принимается только в PDF — filter-by-type отсекает чужие форматы, а правила страхуют от пустой отправки и слишком тяжёлого файла.

Sandbox Storybook

Галерея изображений ​

filter-by-type="image/*" пропускает только картинки — каждая автоматически получает превью в списке. inset-file-list собирает загруженное внутри зоны, show-size помогает следить за объёмом.

Sandbox Storybook

Загрузка при выборе ​

Файлы не обязаны ждать отправки формы — начните загрузку сразу: следите за моделью, включайте loading на время запроса и подтверждайте результат через messages. Здесь запрос имитируется таймером.

Sandbox Storybook

API ​

CdsFileUpload ​

Пропсы

ИмяТипПо умолчаниюОписание
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendIconIconValue | undefined—Иконка в слоте append после контента
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
browseTextstring | undefined'$cds.fileUpload.browse'Текст кнопки выбора файлов. Поддерживает ключи локализации ($cds.fileUpload.browse).
centerAffixboolean | undefinedtrueВыровнять по вертикали элементы appendInner, prependInner, clearIcon и label по центру.
clearableboolean | undefined—Разрешает удалять выбранные файлы из списка.
colorstring | undefined—Цвет компонента
descriptionstring | undefined—Описание компонента, отображаемое под меткой
disabledboolean | null | undefinednullЗаблокированное состояние
dividerTextstring | undefined'$cds.fileUpload.divider'Текст разделителя между иконкой и кнопкой выбора файлов.
errorboolean | undefined—Отображает компонент в состояние ошибки
errorMessagesstring | readonly string[] | null | undefined[]Отображает компонент в состояние ошибки и передает пользовательские сообщения об ошибках. Будет объединяться с любыми проверками, заданными в свойстве rules. Это поле не запускает валидацию.
filterByTypestring | undefined—Фильтрация файлов по MIME-типу или расширению (например image/*,.pdf). Отклонённые файлы не попадают в модель.
focusedboolean | undefined—Управляет состоянием фокуса компонента. Когда true, компонент считается сфокусированным и может применять соответствующие стили или поведение.
hideBrowseboolean | undefined—Скрывает кнопку выбора файлов — зона загрузки становится кликабельной целиком.
hideDetailsboolean | "auto" | undefined—Скрытие блока с деталями (сообщениями и подсказками). При значении 'auto' блок скрывается, если нет сообщений
hideMessagesboolean | undefined—Скрыть сообщения под полем ввода
hintstring | undefined—Текст подсказки, отображаемый под полем ввода
iconIconValue | undefined'upload'Иконка в центре зоны загрузки.
iconColorstring | boolean | undefined—Цвет иконки. Принимает булево значение или строку с цветом
idstring | undefined—Уникальный идентификатор компонента
insetFileListboolean | undefined—Отображает список выбранных файлов внутри зоны загрузки, а не под ней.
labelstring | undefined—Текст метки (label) компонента
loadingstring | boolean | undefined—Индикатор загрузки для компонента
maxErrorsstring | number | undefined1Максимальное число отображаемых ошибок при валидации
maxWidthstring | number | undefined—Максимальная ширина компонента
messagesstring | readonly string[] | undefined[]Сообщения для отображения под полем ввода
minWidthstring | number | undefined—Минимальная ширина компонента
modelValueFile | File[] | null | undefinednullВыбранные файлы. Массив при multiple, иначе одиночный File.
multipleboolean | undefined—Разрешает выбор нескольких файлов.
namestring | undefined—Имя поля ввода
persistentHintboolean | undefined—Всегда отображать подсказку, а не только при фокусе
prependIconIconValue | undefined—Иконка в слоте prepend перед контентом
readonlyboolean | null | undefinednullТолько для чтения
rulesreadonly ValidationRule[] | undefined[]Принимает массив, состоящий из элементов различных типов: функций, логических значений и строк. Функции принимают входное значение в качестве аргумента и должны возвращать либо true / false, либо строку, содержащую сообщение об ошибке. Поле ввода перейдет в состояние ошибки, если функция возвращает значение false (или любое значение в массиве содержит false) либо является строкой.
scrimstring | boolean | undefinedtrueЗатемнение зоны загрузки при перетаскивании файлов.
showSizeShowSize | undefinedfalseОтображает размер файла. Число задаёт основание для перевода в человекочитаемый вид.
size"sm" | "md" | "lg" | undefined'md'Размер зоны загрузки. При sm зона отображается компактной строкой без кнопки выбора файлов и разделителя.
subtitlestring | undefined—Подзаголовок под кнопкой выбора файлов. Отображается только при size md и lg.
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
titlestring | undefined'$cds.fileUpload.title'Заголовок зоны загрузки.
validateOnValidateOn | undefined—Изменяет тип события, при котором запускается валидация
validationValueany—Значение, используемое при применении правил валидации
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
rejected[files: File[]]Файлы не прошли фильтрацию по filterByType.
update:focused[focused: boolean]Изменилось состояние фокуса.
update:modelValue[files: File[]]Список выбранных файлов изменился.

Слоты

ИмяТипОписание
appendCdsInputSlotДобавляет элемент после поля ввода
browseCdsFileUploadBrowseSlotКнопка выбора файлов.
defaultanyПолностью заменяет зону загрузки собственной разметкой.
description{ description: string | undefined; props: Record<string, any>; }Слот по умолчанию для компонента CdsDescription
detailsCdsInputSlotСлот для ввода пользовательских данных, позволяющее настраивать отображение сообщений
divideranyРазделитель между заголовком и кнопкой выбора файлов.
iconanyИконка в центре зоны загрузки.
input{ inputNode: VNode<RendererNode, RendererElement, { [key: string]: any; }>; }Нативный input[type=file], отдаётся для ручного размещения в разметке.
itemCdsFileUploadFileSlotЭлемент списка выбранных файлов.
label{ label: string | undefined; props: Record<string, any>; }Слот по умолчанию для компонента CdsLabel
loaderLoaderSlotPropsИндикатор загрузки.
messageCdsMessageSlotСлот для настройки содержания сообщения
messagesCdsInputSlotСлот для ввода пользовательских данных, позволяющее настраивать отображение сообщений
prependCdsInputSlotДобавляет элемент до поля ввода
singleCdsFileUploadFileSlotЕдинственный выбранный файл при insetFileList без multiple.
titleanyЗаголовок зоны загрузки.

Exposed

ИмяТипОписание
controlRefHTMLInputElement | undefinedСсылка на нативный элемент input[type=file] — для программного открытия диалога выбора файлов.
isDirtybooleanЯвляется ли поле ввода "грязным"
isDisabledbooleanЯвляется ли поле ввода заблокированным
isPurebooleanЯвляется ли поле ввода "чистым"
isReadonlybooleanЯвляется ли поле ввода только для чтения
isValidboolean | nullЯвляется ли поле ввода валидным
isValidatingbooleanЯвляется ли поле ввода в процессе валидации
reset() => Promise<void>Функция сброса поля ввода в исходное состояние
resetValidation() => Promise<void>Функция сброса валидации поля ввода
validate(silent?: boolean) => Promise<string[]>Функция валидации поля ввода

CdsFileUploadDropzone ​

Пропсы

ИмяТипПо умолчаниюОписание
browseTextstring | undefined'$cds.fileUpload.browse'Текст кнопки выбора файлов. Поддерживает ключи локализации ($cds.fileUpload.browse).
clearableboolean | undefined—Разрешает удалять выбранные файлы из списка.
colorstring | undefined—Цвет фона поверхности
disabledboolean | null | undefinednullЗаблокированное состояние
dividerTextstring | undefined'$cds.fileUpload.divider'Текст разделителя между иконкой и кнопкой выбора файлов.
errorboolean | undefined—Отображает зону загрузки в состоянии ошибки.
heightstring | number | undefined—Высота компонента
hideBrowseboolean | undefined—Скрывает кнопку выбора файлов — зона загрузки становится кликабельной целиком.
iconIconValue | undefined'upload'Иконка в центре зоны загрузки.
insetFileListboolean | undefined—Отображает список выбранных файлов внутри зоны загрузки, а не под ней.
lengthstring | number | undefined150Длина разделителя. Единица измерения по умолчанию — пиксели.
locationAnchor | null | undefined—Позиционирование элемента относительно его контейнера. Например, "top left", "center", "bottom right" и т.д.
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
modelValueFile[] | undefined[]Список выбранных файлов. Используется, когда CdsFileUploadDropzone применяется автономно.
multipleboolean | undefined—Разрешает выбор нескольких файлов.
opacitystring | number | undefined—Прозрачность разделителя.
position"absolute" | "static" | "fixed" | "relative" | "sticky" | undefined—CSS-позиционирование компонента — значение свойства position
readonlyboolean | null | undefinednullТолько для чтения
scrimstring | boolean | undefinedtrueЗатемнение зоны загрузки при перетаскивании файлов.
showSizeShowSize | undefinedfalseОтображает размер файла. Число задаёт основание для перевода в человекочитаемый вид.
size"sm" | "md" | "lg" | undefined'md'Размер зоны загрузки. При sm зона отображается компактной строкой без кнопки выбора файлов и разделителя.
subtitlestring | undefined—Подзаголовок под кнопкой выбора файлов. Отображается только при size md и lg.
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
themestring | undefined—Тема компонента
thicknessstring | number | undefined—Толщина разделителя. Единица измерения по умолчанию — пиксели.
titlestring | undefined'$cds.fileUpload.title'Заголовок зоны загрузки.
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
click:browse[]Нажата кнопка выбора файлов.
click:remove[index: number]Запрошено удаление файла по индексу.
drop[files: File[]]Файлы перенесены в зону загрузки.

Слоты

ИмяТипОписание
browseCdsFileUploadBrowseSlotКнопка выбора файлов.
default{ isDragging: boolean; hasFiles: boolean; files: readonly File[]; props: { onClick: () => void; }; }Полностью заменяет содержимое зоны загрузки.
divideranyРазделитель между заголовком и кнопкой выбора файлов.
iconanyИконка в центре зоны загрузки.
inputanyНативный input[type=file].
itemCdsFileUploadFileSlotЭлемент списка выбранных файлов внутри зоны загрузки.
loaderanyИндикатор загрузки.
singleCdsFileUploadFileSlotЕдинственный выбранный файл при insetFileList без multiple.
titleanyЗаголовок зоны загрузки.

CdsFileUploadItem ​

Пропсы

ИмяТипПо умолчаниюОписание
activeboolean | undefined—Принудительно задаёт активное состояние элемента
activeClassstring | undefined—Класс, применяемый к элементам списка, когда они находятся в активном состоянии
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
appendAvatarstring | undefined—Аватар (URL изображения), отображаемый после контента элемента
appendIconIconValue | undefined—Иконка, отображаемая после контента элемента
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
clearableboolean | undefined—Разрешает удалить файл из списка.
colorstring | undefined—Цвет компонента
descriptionstring | number | boolean | undefined—Описание элемента списка, отображаемое под заголовком и подзаголовком
disabledboolean | null | undefinednullЗаблокированное состояние
exactboolean | undefined—Если true, активное состояние будет применяться только при точном совпадении маршрута
fileFile | undefinednullФайл, который отображает элемент списка.
fileIconIconValue | undefined'file'Иконка-заглушка для файлов, у которых нет превью.
heightstring | number | undefined—Высота компонента
hrefstring | undefined—Атрибут href для ссылки. Если указан, компонент будет вести себя как обычная ссылка
indexnumber | undefined—Индекс элемента, используется для клавиатурной навигации
linesfalse | "one" | "two" | "three" | undefined'two'Количество строк в элементах списка, влияет на их высоту. false отключает фиксированную высоту
linkboolean | undefined—Делает элемент кликабельной ссылкой. Определяется автоматически при наличии href/to
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
navboolean | undefined—Применяет стили навигационного списка (скруглённые активные элементы)
prependAvatarstring | undefined—Аватар (URL изображения), отображаемый перед контентом элемента
prependGapstring | number | undefined—Отступ перед контентом элемента (резервируется место под prepend-иконку/аватар)
prependIconIconValue | undefined—Иконка, отображаемая перед контентом элемента
replaceboolean | undefined—Если true, навигация по маршруту будет заменять текущую запись в истории вместо добавления новой
showSizeShowSize | undefinedfalseОтображает размер файла вместо его MIME-типа.
slimboolean | undefined—Убирает внутренние отступы списка и контейнера меню: список полностью заполняет доступную область
subtitlestring | number | boolean | undefined—Подзаголовок элемента, отображаемый под заголовком
tabindexstring | number | undefined—Значение атрибута tabindex элемента
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
titlestring | number | boolean | undefined—Заголовок элемента, отображаемый в компоненте
toLinkTo | undefined—Маршрут назначения или объект для RouterLink. Если указан, компонент будет вести себя как RouterLink
valueany—Значение элемента, используемое при выборе/активации в списке
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
click[event: MouseEvent | KeyboardEvent]Клик по элементу списка.
click:remove[]Запрошено удаление файла.

Слоты

ИмяТипОписание
appendListItemSlotКонтент после текста элемента (на месте append-иконки/аватара)
clear{ props: { onClick: () => void; }; }Кнопка удаления файла.
defaultListItemSlotКонтент по умолчанию внутри элемента
descriptionListItemDescriptionSlotКонтент описания элемента (отображается под заголовком и подзаголовком)
prependListItemSlotКонтент перед текстом элемента (на месте prepend-иконки/аватара)
subtitleListItemSubtitleSlotКонтент подзаголовка элемента
titleListItemTitleSlotКонтент заголовка элемента

CdsFileUploadList ​

Пропсы

ИмяТипПо умолчаниюОписание
activatableboolean | undefined—Разрешает активацию элементов (выделение текущего элемента без режима выбора)
activatedany—Идентификаторы активных элементов (поддерживает v-model через update:activated)
activeClassstring | undefined—Класс, применяемый к элементам списка, когда они находятся в активном состоянии
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
activeStrategyActiveStrategyProp | undefined—Стратегия активации элементов (одиночная, множественная и т.д.)
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
clearableboolean | undefined—Разрешает удалять файлы из списка.
collapseIconIconValue | undefined—Иконка, отображаемая у свёрнутой группы
colorstring | undefined—Цвет компонента
disabledboolean | null | undefinednullЗаблокированное состояние
expandIconIconValue | undefined—Иконка, отображаемая у раскрытой группы
filesFile[] | undefined—Список файлов. По умолчанию берётся из контекста CdsFileUpload.
filterableboolean | undefined—FOR INTERNAL USE ONLY Включает режим фильтрации: пробел не выбирает элемент, а используется для ввода. Применимо в компонентах CdsCombobox, CdsAutocomplete
heightstring | number | undefined—Высота компонента
indentstring | number | undefined—Величина отступа для вложенных групп элементов
itemChildrenSelectItemKey'children'Свойство объекта, содержащее дочерние элементы, либо функция для их получения
itemPropsSelectItemKey'props'Свойство объекта, содержащее пропсы для элемента, либо функция для их получения
itemsany[] | undefined[]Массив элементов для отображения
itemsRegistrationItemsRegistrationType | undefined'render'Стратегия регистрации элементов: render — по мере рендеринга, иначе единоразово
itemTitleSelectItemKey'title'Свойство объекта, используемое как заголовок элемента, либо функция для его получения
itemTypeSelectItemKey'type'Свойство объекта, определяющее тип элемента (item, divider, subheader), либо функция для его получения
itemValueSelectItemKey'value'Свойство объекта, используемое как значение элемента, либо функция для его получения
linesfalse | "one" | "two" | "three" | undefinedfalseКоличество строк в элементах списка, влияет на их высоту. false отключает фиксированную высоту
mandatoryboolean | undefined—Делает выбор обязательным: запрещает снимать выбор с последнего элемента
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
navboolean | undefined—Применяет стили навигационного списка (скруглённые активные элементы)
navigationIndexnumber | undefined—Индекс текущего элемента при клавиатурной навигации (поддерживает v-model)
navigationStrategy"focus" | "track" | undefined'focus'Стратегия клавиатурной навигации: focus — перенос фокуса, track — виртуальный курсор
openedany—Идентификаторы раскрытых групп (поддерживает v-model через update:opened)
openStrategyOpenStrategyProp | undefined'list'Стратегия раскрытия групп (list, single, multiple)
prependGapstring | number | undefined—Отступ перед контентом элемента (резервируется место под prepend-иконку/аватар)
requiredboolean | undefined—Делает выбор обязательным: запрещает снимать выбор с последнего элемента
returnObjectboolean | undefined—Возвращать в значении модели объект вместо массива
selectableboolean | undefined—Разрешает выбор элементов
selectedany—Идентификаторы выбранных элементов (поддерживает v-model через update:selected)
selectStrategySelectStrategyProp | undefined'single-leaf'Стратегия выбора элементов (single-leaf, leaf, independent, classic и т.д.)
showSizeShowSize | undefinedfalseОтображает размер каждого файла.
slimboolean | undefined—Убирает внутренние отступы списка и контейнера меню: список полностью заполняет доступную область
tagstring | JSXComponent<any> | undefined'div'Пользовательский HTML-тег для отображения
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
valueComparatorValueComparator | undefined—Функция сравнения значений элементов для определения выбранного состояния
widthstring | number | undefined—Ширина компонента

Слоты

ИмяТипОписание
default{ files: readonly File[]; onClickRemove: (index: number) => void; }Полностью заменяет содержимое списка.
itemCdsFileUploadFileSlotЭлемент списка.