Представление списка задач
Слот issues.view добавляет представление в переключатель над результатами на странице Задачи и в сохраненных фильтрах. Он доступен на настольной версии страниц /issues и /issues/<filter_id>. Название представления задается полем title в манифесте и отображается рядом с вариантами Список, Календарь и Гант.
Когда пользователь выбирает представление плагина, интерфейс плагина занимает область результатов. Панель фильтра остается на странице: пользователь может менять условия поиска, не закрывая представление. Слот не используется в списках задач очереди и проекта.
![]()
Настройка слота
Создайте проект командой weavix create и выберите шаблон issues.view. В существующем проекте добавьте слот в slots.tracker манифеста:
{
"slots": {
"tracker": {
"issues.view": [
{
"entrypoint": "index.html",
"contextLevel": "full",
"title": {
"ru": "Мое представление",
"en": "My view"
}
}
]
}
}
}
Это фрагмент манифеста: сохраните остальные обязательные поля вашего проекта. Для получения текущего фильтра укажите contextLevel: "full". У глобального списка задач нет идентификатора отдельной сущности, поэтому уровень basic не содержит условия поиска.
Контекст слота
Полный контекст слота имеет тип IssueViewSlotContext: entityType со значением issues и объект filter с фактически примененными условиями. Контекст включает несохраненные изменения фильтра. savedFilterId может отсутствовать, поэтому идентификатор сохраненного фильтра нельзя использовать как единственный источник условий поиска.
Типы IssueViewSlotContext, IssueViewFilter и IssueFilterConditions экспортируются из SDK. Общая оболочка ListViewSlotContext<TEntity, TFilter> содержит тип списка и типизированный фильтр:
type IssueViewSlotContext = ListViewSlotContext<'issues', IssueViewFilter>;
type IssueViewFilter = {
savedFilterId?: string;
searchText?: string;
sort?: { orderBy: string; orderAsc?: boolean };
groupBy?: string;
tree?: boolean;
} & (
| { mode: 'params'; conditions: IssueFilterConditions }
| { mode: 'query'; query: string; conditions?: IssueFilterConditions }
| { mode: 'query2'; query: string; conditions?: IssueFilterConditions }
);
IssueFilterConditions — объект с именами полей фильтра и их значениями: строками, числами, массивами или диапазонами.
Поле filter.mode определяет формат условий:
|
Значение |
Поля |
Смысл |
|
|
|
Условия, заданные через элементы фильтра. |
|
|
|
Примененный QL1-запрос. Если в контексте есть |
|
|
|
Примененный QL2-запрос. Изменения в редакторе, которые пользователь еще не применил, в контекст не входят. Сейчас Трекер передает строку запроса без дополнительных условий. |
В объекте filter также могут присутствовать:
|
Поле |
Смысл |
|
|
Идентификатор сохраненного фильтра, если открыта его страница. |
|
|
Текст отдельного поля поиска. Он передается без преобразования, только когда применяется в текущем режиме. Учитывайте его один раз вместе с условиями режима. |
|
|
Поле активной сортировки. |
|
|
Поле группировки, если оно доступно для примененного режима. |
|
|
Признак древовидного представления, если он доступен для примененного режима. |
Для QL2 Трекер передает примененную строку запроса. Настройки сортировки, группировки и дерева из другого режима фильтра не добавляются к QL2-контексту. Контекст не содержит массив найденных задач: плагин получает критерии для собственного представления результатов.
QL2 и публичный API
Сериализованное выражение QL2 из filter.query нельзя без проверки подставлять в параметр query публичного API. Перед запросом задач проверьте, поддерживает ли доступный плагину метод выбранный режим поиска.
Обновления контекста
При изменении примененного фильтра Трекер отправляет событие context.changed. Хук useTrackerPluginContext<'issues.view'>('full') получает новый контекст и обновляет компонент. Строя представление, используйте актуальное значение filter, а не только значение при первом открытии.
Выбранное представление сохраняется в параметре URL _view=plugin:<plugin_slug>. Ссылку на представление можно открыть на странице задач или сохраненного фильтра, если плагин доступен пользователю.
Другие списки
issues.view относится только к глобальному списку задач. Оболочка ListViewSlotContext допускает отдельные типы фильтров для других списков. Представления проектов и портфелей потребуют собственных слотов и типов условий; формат IssueViewFilter на них не распространяется.