TagSelector в ui.entity-selector
TagSelector показывает выбранные элементы в виде тегов. Виджет можно использовать отдельно или связать с Dialog, чтобы пользователь выбирал элементы из диалога.
TagSelector подходит для множественного выбора участников, наблюдателей и связанных объектов, где выбранные значения должны оставаться видимыми в форме.
Параметры селектора описаны в разделе TagSelectorOptions, настройки связанного диалога — в статьях Dialog и DialogOptions.
Создать TagSelector
Передайте контейнер в renderTo(). Начальные теги можно задать в items.
import { TagSelector } from 'ui.entity-selector';
const container = document.getElementById('observers-selector');
if (container)
{
const selector = new TagSelector({
multiple: true,
addButtonCaption: 'Добавить',
items: [
{
id: 1,
entityId: 'user',
title: 'Иван Петров',
deselectable: false,
},
],
events: {
onBeforeTagRemove: (event) => {
const { tag } = event.getData();
if (!tag.isDeselectable())
{
event.preventDefault();
}
},
},
});
selector.renderTo(container);
}
Каждый тег показывает заголовок элемента и кнопку удаления. Так как multiple: true, пользователь может добавить несколько тегов подряд через кнопку «Добавить».

На изображении показан TagSelector с одним выбранным тегом и кнопкой добавления.
Тег, как и элемент диалога, определяется парой entityId и id. В примере тег нельзя удалить, потому что у элемента задано deselectable: false, а обработчик onBeforeTagRemove отменяет удаление через event.preventDefault().
Связать TagSelector с Dialog
Если передать dialogOptions, TagSelector создаст связанный Dialog. При выборе элемента в диалоге тег добавится в поле, а при удалении тега выбор снимется в диалоге.
import { TagSelector } from 'ui.entity-selector';
const container = document.getElementById('observers-selector');
if (container)
{
const selector = new TagSelector({
multiple: true,
addButtonCaption: 'Выбрать',
dialogOptions: {
targetNode: container,
context: 'MY_MODULE_OBSERVERS',
enableSearch: true,
entities: [
{
id: 'user',
dynamicLoad: true,
dynamicSearch: true,
},
],
preselectedItems: [
['user', 1],
],
events: {
'Item:onDeselect': (event) => {
const { item } = event.getData();
console.log(item.getEntityId(), item.getId());
},
},
},
});
selector.renderTo(container);
}
Передавайте в dialogOptions.targetNode реальный DOM-элемент. TagSelector отрисовывается в контейнер, а диалог использует тот же элемент как точку привязки.
Для стандартных типов объектов используйте entityId из статьи Стандартные провайдеры. Для собственного типа объекта зарегистрируйте провайдер данных, чтобы dynamicLoad, dynamicSearch и preselectedItems могли получить данные с сервера.
Передать выбранные элементы
Для локальных данных используйте items в TagSelector или selectedItems в Dialog.
| Что нужно сделать | Где передать | Что передавать |
|---|---|---|
| Показать готовые локальные теги | TagSelector.items |
Объекты с id, entityId, title и параметрами тега |
| Открыть диалог с локально выбранными элементами | Dialog.selectedItems внутри dialogOptions |
Полные локальные элементы ItemOptions |
| Загрузить выбранные элементы с сервера | dialogOptions.preselectedItems |
Пары [entityId, id], которые обработает провайдер |
const selector = new TagSelector({
items: [
{
id: 1,
entityId: 'user',
title: 'Иван Петров',
},
],
});
Если данные выбранных элементов должен вернуть провайдер, передайте идентификаторы в dialogOptions.preselectedItems.
const selector = new TagSelector({
dialogOptions: {
targetNode: container,
entities: [
{
id: 'user',
dynamicLoad: true,
},
],
preselectedItems: [
['user', 1],
['user', 2],
],
},
});
preselectedItems содержит пары [entityId, id]. Провайдер вернет данные элементов в методе getPreselectedItems() или getItems(). Связь preselectedItems с PHP-провайдером описана в статье Провайдеры данных.
Настроить ввод
showTextBox показывает текстовое поле. В обработчиках onInput, onEnter и onMetaEnter можно обработать ввод и создать теги программно.
const selector = new TagSelector({
showTextBox: true,
placeholder: 'Введите название',
events: {
onEnter: (event) => {
const selector = event.getTarget();
const title = selector.getTextBoxValue().trim();
if (title !== '')
{
selector.addTag({
id: Date.now(),
entityId: 'manual',
title,
});
selector.clearTextBox();
}
},
},
});
В примере Date.now() создает временный локальный идентификатор, а clearTextBox() очищает поле после добавления тега. Если тег связан с серверным объектом, используйте постоянный id этого объекта.
Ограничить доступность селектора
Если readonly: true, пользователь не сможет изменить выбранные теги. Если locked: true, селектор блокирует интерактивность.
| Параметр | Что блокирует | Когда использовать |
|---|---|---|
readonly |
Изменение выбранных тегов | Когда форму нужно показать без редактирования выбора |
locked |
Интерактивность селектора | Когда нужно временно заблокировать поле на время внешнего действия |
deselectable |
Удаление конкретного тега или всех тегов по умолчанию | Когда часть выбранных значений должна остаться в форме |
Конструктор TagSelector
Конструктор создает экземпляр поля с тегами. После создания отрисуйте экземпляр в DOM методом renderTo().
new TagSelector(selectorOptions) принимает объект настроек selectorOptions. В нем передайте начальные теги, параметры отображения, обработчики событий и настройки связанного диалога.
Пример создания поля с тегами есть в разделе Создать TagSelector.
Параметры конструктора
В конструктор TagSelector передается объект TagSelectorOptions. Для начальных тегов внутри него используется структура TagItemOptions.
TagSelectorOptions
TagSelectorOptions описывает поле с тегами и связь с диалогом.
Все параметры TagSelectorOptions необязательны. Для выбора тегов через диалог передайте dialogOptions. Для локальных начальных тегов используйте items. Если параметр не указан и для него не описано значение по умолчанию, селектор использует стандартное поведение.
| Параметр | Тип | Описание |
|---|---|---|
id |
string |
Идентификатор селектора |
items |
TagItemOptions[] |
Начальные теги |
dialogOptions |
DialogOptions |
Параметры связанного Dialog |
multiple |
boolean |
Разрешает несколько тегов. По умолчанию true |
readonly |
boolean |
Запрещает изменение выбранных тегов. По умолчанию false |
locked |
boolean |
Блокирует интерактивность селектора. По умолчанию false |
deselectable |
boolean |
Разрешает удалять теги. По умолчанию true |
showAddButton |
boolean |
Показывает кнопку добавления. По умолчанию true |
showCreateButton |
boolean |
Показывает кнопку создания. По умолчанию false |
showTextBox |
boolean |
Показывает текстовое поле. По умолчанию false |
addButtonCaption |
string |
Текст кнопки добавления |
addButtonCaptionMore |
string |
Текст кнопки добавления, когда в селекторе уже есть теги |
createButtonCaption |
string |
Текст кнопки создания |
placeholder |
string |
Текст в пустом текстовом поле. По умолчанию пустая строка |
maxHeight |
number |
Максимальная высота селектора |
textBoxAutoHide |
boolean |
Скрывает текстовое поле, когда оно не используется |
textBoxWidth |
string или number |
Ширина текстового поля |
tagAvatar |
string |
Аватар тега по умолчанию |
tagAvatarOptions |
AvatarOptions |
Параметры аватара тега |
tagMaxWidth |
number |
Максимальная ширина тега |
tagTextColor |
string |
Цвет текста тега |
tagBgColor |
string |
Цвет фона тега |
tagFontWeight |
string |
Насыщенность шрифта тега |
tagClickable |
boolean |
Делает тег кликабельным |
events |
Object |
Обработчики событий селектора |
TagItemOptions
TagItemOptions описывает один тег в TagSelector. Параметры id и entityId обязательны.
Остальные параметры TagItemOptions необязательные. Если не передать title, тег не получит текст для отображения. Если не передать параметры внешнего вида, селектор использует настройки тега по умолчанию из TagSelectorOptions.
| Параметр | Тип | Описание |
|---|---|---|
id |
string, number |
Идентификатор тега внутри типа объекта |
entityId |
string |
Идентификатор типа объекта. Конструктор требует непустую строку |
entityType |
string |
Тип элемента внутри объекта. По умолчанию default |
title |
string или TextNodeOptions |
Текст тега |
avatar |
string |
Путь к аватару |
avatarOptions |
AvatarOptions |
Параметры аватара |
textColor |
string |
Цвет текста |
bgColor |
string |
Цвет фона |
fontWeight |
string |
Насыщенность шрифта |
link |
string |
Ссылка тега |
onclick |
Function |
Обработчик клика по тегу |
clickable |
boolean |
Делает тег кликабельным |
maxWidth |
number |
Максимальная ширина тега |
deselectable |
boolean |
Разрешает удалить тег |
animate |
boolean |
Включает анимацию появления тега |
customData |
Object |
Дополнительные данные сценария |
JS-классы TagSelector
| Класс | Что делает |
|---|---|
TagSelector |
Управляет полем с тегами, текстовым вводом, кнопками и связанным диалогом |
TagItem |
Представляет один тег внутри TagSelector |
TagSelector
В таблицах ниже аргументы методов указаны в скобках. node — DOM-элемент для отрисовки, dialog — экземпляр Dialog, tagOptions — объект TagItemOptions, item — экземпляр TagItem или объект { id, entityId }, animate — флаг анимации удаления. Методы get* возвращают текущее значение, методы set* изменяют настройку селектора.
Отображение и связь с Dialog
| Метод | Что делает |
|---|---|
renderTo(node) |
Отрисовывает селектор внутри DOM-элемента |
isRendered() |
Возвращает true, если селектор уже отрисован |
getDialog() |
Возвращает связанный диалог |
setDialog(dialog) |
Задает связанный диалог |
const selector = new TagSelector({
dialogOptions: {
targetNode: container,
entities: [
{
id: 'user',
dynamicLoad: true,
},
],
},
});
selector.renderTo(container);
Теги
| Метод | Что делает |
|---|---|
getTags() |
Возвращает все теги селектора |
getTag(tagItem) |
Возвращает тег по экземпляру TagItem или по объекту { id, entityId } |
addTag(tagOptions) |
Добавляет тег в селектор |
removeTag(item, animate) |
Удаляет тег из селектора |
removeTags() |
Удаляет все теги |
updateTags() |
Перерисовывает теги и пересчитывает высоту селектора |
selector.addTag({
id: 2,
entityId: 'user',
title: 'Мария Иванова',
});
selector.removeTag({
id: 1,
entityId: 'user',
});
Состояние и поведение
| Метод | Что делает |
|---|---|
isMultiple() |
Возвращает true, если разрешено несколько тегов |
setReadonly(flag) |
Управляет режимом только для чтения |
isReadonly() |
Возвращает true, если включен режим только для чтения |
setLocked(flag) |
Управляет блокировкой ввода |
lock() |
Блокирует ввод |
unlock() |
Разблокирует ввод |
isLocked() |
Возвращает true, если ввод заблокирован |
setDeselectable(flag) |
Управляет возможностью удалять теги по умолчанию |
isDeselectable() |
Возвращает true, если теги можно удалять по умолчанию |
Текстовое поле
| Метод | Что делает |
|---|---|
getTextBox() |
Возвращает DOM-элемент текстового поля |
getTextBoxValue() |
Возвращает текущее значение текстового поля |
clearTextBox() |
Очищает текстовое поле |
showTextBox() |
Показывает текстовое поле |
hideTextBox() |
Скрывает текстовое поле |
focusTextBox() |
Переводит фокус в текстовое поле |
setTextBoxAutoHide(autoHide) |
Включает или выключает автоскрытие текстового поля |
getTextBoxWidth() |
Возвращает ширину текстового поля |
setTextBoxWidth(width) |
Задает ширину текстового поля |
getPlaceholder() |
Возвращает текст в пустом текстовом поле |
setPlaceholder(text) |
Задает текст в пустом текстовом поле |
const selector = new TagSelector({
showTextBox: true,
events: {
onEnter: (event) => {
const selector = event.getTarget();
const title = selector.getTextBoxValue().trim();
if (title !== '')
{
selector.addTag({
id: Date.now(),
entityId: 'manual',
title,
});
selector.clearTextBox();
}
},
},
});
Кнопки
| Метод | Что делает |
|---|---|
getAddButton() |
Возвращает DOM-элемент кнопки добавления |
getAddButtonLink() |
Возвращает DOM-элемент ссылки кнопки добавления |
getAddButtonCaption() |
Возвращает текст кнопки добавления |
setAddButtonCaption(caption) |
Задает текст кнопки добавления |
getAddButtonCaptionMore() |
Возвращает текст кнопки добавления, когда есть теги |
setAddButtonCaptionMore(caption) |
Задает текст кнопки добавления, когда есть теги |
toggleAddButtonCaption() |
Переключает текущий текст кнопки добавления |
getActualButtonCaption() |
Возвращает текущий текст кнопки добавления |
showAddButton() |
Показывает кнопку добавления |
hideAddButton() |
Скрывает кнопку добавления |
getCreateButton() |
Возвращает DOM-элемент кнопки создания |
showCreateButton() |
Показывает кнопку создания |
hideCreateButton() |
Скрывает кнопку создания |
getCreateButtonCaption() |
Возвращает текст кнопки создания |
setCreateButtonCaption(caption) |
Задает текст кнопки создания |
Оформление тегов по умолчанию
| Метод | Что делает |
|---|---|
getTagAvatar() |
Возвращает аватар тега по умолчанию |
setTagAvatar(avatar) |
Задает аватар тега по умолчанию |
getTagAvatarOptions() |
Возвращает параметры аватара тега по умолчанию |
getTagAvatarOption(option) |
Возвращает один параметр аватара тега по умолчанию |
setTagAvatarOption(option, value) |
Задает один параметр аватара тега по умолчанию |
setTagAvatarOptions(options) |
Задает параметры аватара тега по умолчанию |
getTagMaxWidth() |
Возвращает максимальную ширину тега по умолчанию |
setTagMaxWidth(width) |
Задает максимальную ширину тега по умолчанию |
getTagTextColor() |
Возвращает цвет текста тега по умолчанию |
setTagTextColor(color) |
Задает цвет текста тега по умолчанию |
getTagBgColor() |
Возвращает цвет фона тега по умолчанию |
setTagBgColor(color) |
Задает цвет фона тега по умолчанию |
getTagFontWeight() |
Возвращает насыщенность шрифта тега по умолчанию |
setTagFontWeight(weight) |
Задает насыщенность шрифта тега по умолчанию |
getTagClickable() |
Возвращает кликабельность тегов по умолчанию |
setTagClickable(flag) |
Задает кликабельность тегов по умолчанию |
getMaxHeight() |
Возвращает максимальную высоту селектора |
getMinHeight() |
Возвращает минимальную высоту селектора |
setMaxHeight(height) |
Задает максимальную высоту селектора |
TagItem
new TagItem(itemOptions) создает тег. Обычно теги создает TagSelector.addTag().
| Метод | Что делает |
|---|---|
getId() |
Возвращает идентификатор тега |
getEntityId() |
Возвращает идентификатор типа объекта |
getEntityType() |
Возвращает тип тега внутри объекта |
getSelector() |
Возвращает родительский TagSelector |
getTitle() |
Возвращает текст тега |
setTitle(title) |
Задает текст тега |
getAvatar() |
Возвращает аватар тега |
setAvatar(avatar) |
Задает аватар тега |
getAvatarOption(option) |
Возвращает параметр аватара |
setAvatarOption(option, value) |
Задает параметр аватара |
setAvatarOptions(options) |
Задает параметры аватара |
getTextColor() |
Возвращает цвет текста |
setTextColor(color) |
Задает цвет текста |
getBgColor() |
Возвращает цвет фона |
setBgColor(color) |
Задает цвет фона |
getFontWeight() |
Возвращает насыщенность шрифта |
setFontWeight(weight) |
Задает насыщенность шрифта |
getMaxWidth() |
Возвращает максимальную ширину |
setMaxWidth(width) |
Задает максимальную ширину |
setDeselectable(flag) |
Управляет возможностью удалить тег |
isDeselectable() |
Возвращает true, если тег можно удалить |
setClickable(flag) |
Управляет кликабельностью тега |
isClickable() |
Возвращает true, если тег кликабелен |
getLink() |
Возвращает ссылку тега |
getOnclick() |
Возвращает обработчик клика по тегу |
getCustomData() |
Возвращает пользовательские данные тега |
render() |
Перерисовывает тег в DOM |
remove(animate) |
Удаляет тег. Возвращает Promise |
show() |
Анимирует появление тега. Возвращает Promise |
getContainer() |
Возвращает DOM-элемент тега |
getContentContainer() |
Возвращает DOM-элемент содержимого тега |
getAvatarContainer() |
Возвращает DOM-элемент аватара |
getTitleContainer() |
Возвращает DOM-элемент текста тега |
getRemoveIcon() |
Возвращает DOM-элемент иконки удаления |
isRendered() |
Возвращает true, если тег отрисован |
События TagSelector
Передайте обработчики в параметр events. События приходят через объект BaseEvent, данные доступны через event.getData().
События onBeforeTagAdd и onBeforeTagRemove можно отменять через event.preventDefault(). Остальные события используйте для реакции на действие, а не для отмены. В данных tag и item передаются объекты TagItem, event — DOM-событие исходного действия.
const selector = new TagSelector({
events: {
onBeforeTagRemove: (event) => {
const { tag } = event.getData();
if (!tag.isDeselectable())
{
event.preventDefault();
}
},
onAddButtonClick: () => {
selector.getDialog()?.show();
},
},
});
| Событие | Данные события | Когда происходит |
|---|---|---|
onBeforeTagAdd |
tag |
При добавлении тега, до подтверждения |
onTagAdd |
tag |
При добавлении тега |
onAfterTagAdd |
tag |
При завершении добавления тега |
onBeforeTagRemove |
tag |
При удалении тега, до подтверждения |
onTagRemove |
tag |
При удалении тега |
onAfterTagRemove |
tag |
При завершении удаления тега |
TagItem:onClick |
item |
При клике по тегу |
onContainerClick |
event |
При клике по контейнеру селектора |
onInput |
event |
При вводе текста |
onBlur |
event |
При потере фокуса текстовым полем |
onKeyUp |
event |
При отпускании клавиши |
onEnter |
event |
При нажатии Enter |
onMetaEnter |
event |
При нажатии Enter с Meta или Ctrl |
onKeyDown |
event |
При нажатии клавиши |
onAddButtonClick |
event |
При клике по кнопке добавления |
onCreateButtonClick |
event |
При клике по кнопке создания |
Пример TagSelector со связанным Dialog
const selector = new TagSelector({
multiple: true,
addButtonCaption: 'Выбрать',
dialogOptions: {
targetNode: container,
context: 'MY_MODULE_OBSERVERS',
enableSearch: true,
entities: [
{
id: 'user',
dynamicLoad: true,
dynamicSearch: true,
},
],
preselectedItems: [
['user', 1],
],
},
});
selector.renderTo(container);