Tom Select применяется в сценариях работы с файлами и медиа как слой
пользовательского интерфейса поверх данных, представляющих элементы
медиатеки или файловой системы. Вместо прямого взаимодействия с
<input type="file"> или статичными списками,
компонент используется для построения расширенного выбора: с поиском,
группировкой, предпросмотром и асинхронной подгрузкой метаданных.
В основе подхода лежит трансформация файловой структуры в набор опций. Каждый файл становится объектом с набором полей:
Tom Select работает с такими структурами через стандартные options, где value соответствует уникальному идентификатору, а text используется как человекочитаемое имя.
Пример логики данных:
{
value: "file_1024",
text: "forest_photo.jpg",
type: "image",
size: 204800,
thumbnail: "/thumbs/forest_photo.jpg"
}
При таком подходе файловый список перестает быть плоским перечислением и превращается в интерактивную медиатеку.
Базовая конфигурация Tom Select для работы с файлами опирается на множественный выбор и кастомные шаблоны отображения:
new TomSelect("#media-select", {
maxItems: null,
valueField: "value",
labelField: "text",
searchField: ["text", "type"],
options: [],
render: {}
});
Ключевым моментом становится отключение ограничений по количеству выбранных элементов и расширение поисковых полей, чтобы поддерживать фильтрацию по типу и имени.
Работа с медиа требует визуального представления, выходящего за рамки текста. Поэтому используется кастомизация render:
render: {
option: function(data, escape) {
return `
<div class="media-option">
<img src="${escape(data.thumbnail)}" />
<div class="media-info">
<div class="title">${escape(data.text)}</div>
<div class="meta">${escape(data.type)} • ${escape(data.size)}</div>
</div>
</div>
`;
},
item: function(data, escape) {
return `
<div class="media-item">
${escape(data.text)}
</div>
`;
}
}
Такой подход превращает выпадающий список в полноценный медиабраузер, где каждый элемент имеет визуальный контекст.
При работе с большими медиатеками важна структуризация. Элементы группируются по типу:
Внутри Tom Select это реализуется через optgroup, что
позволяет визуально разделять категории:
optgroups: [
{ value: "images", label: "Изображения" },
{ value: "videos", label: "Видео" },
{ value: "audio", label: "Аудио" }
]
Каждый файл получает привязку к группе, что улучшает навигацию при больших объемах данных.
Медиа редко хранится в статическом виде на клиенте. Чаще данные загружаются через API. Tom Select поддерживает режим удаленного поиска:
load: function(query, callback) {
fetch(`/api/media?q=${encodeURIComponent(query)}`)
.then(res => res.json())
.then(data => callback(data))
.catch(() => callback());
}
Такой механизм позволяет реализовать серверный поиск по:
При масштабных библиотеках это критично, так как клиент не хранит весь список файлов.
Поисковый механизм расширяется за счет поля searchField.
Для медиа это особенно важно, так как один объект может иметь множество
атрибутов:
searchField: ["text", "type", "tags"]
Таким образом поиск по запросу «jpg» или «видео» возвращает релевантные элементы без дополнительной логики.
Медиасценарии требуют моментального визуального отклика. Элементы списка дополняются:
Дополнительные поля не влияют на выбор, но повышают информативность интерфейса.
Внутри render можно добавлять условную логику:
if (data.type === "video") {
// отображение иконки воспроизведения
}
Хотя Tom Select не занимается загрузкой файлов напрямую, он часто используется как слой выбора перед загрузкой.
Типичный поток:
File API или
FormDataПример связки:
const selected = select.getValue();
const formData = new FormData();
selected.forEach(id => formData.append("files[]", id));
fetch("/upload", {
method: "POST",
body: formData
});
В случаях, когда файлы выбираются напрямую с устройства, создаются временные URL:
const url = URL.createObjectURL(file);
Эти ссылки можно передавать в options как thumbnail, позволяя отображать предпросмотр до загрузки на сервер.
Для медиаинтерфейсов важно управлять ограничениями:
В Tom Select это реализуется через onItemAdd и
onChange:
onItemAdd: function(value) {
if (this.items.length > 10) {
this.removeItem(value);
}
}
Такая логика позволяет контролировать бизнес-правила без изменения серверной части.
При тысячах файлов ключевыми становятся:
loadОсобенно критично не перегружать клиент полным списком, а работать через пагинированные API-ответы.
Медиа редко существует изолированно. Часто применяется система коллекций:
Каждый элемент может принадлежать нескольким коллекциям, что удобно реализуется через множественный выбор Tom Select с тегированием.
Дополнительно можно добавлять новые значения на лету, формируя динамическую структуру медиатеки прямо в интерфейсе.