Представление списка задач

Слот 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 определяет формат условий:

Значение

Поля

Смысл

params

conditions — обязательный объект, в том числе пустой {}

Условия, заданные через элементы фильтра.

query

query — строка QL1; conditions — необязательный объект

Примененный QL1-запрос. Если в контексте есть conditions, их нужно учесть вместе с запросом.

query2

query — строка QL2; тип также допускает необязательное conditions

Примененный QL2-запрос. Изменения в редакторе, которые пользователь еще не применил, в контекст не входят. Сейчас Трекер передает строку запроса без дополнительных условий.

В объекте filter также могут присутствовать:

Поле

Смысл

savedFilterId

Идентификатор сохраненного фильтра, если открыта его страница.

searchText

Текст отдельного поля поиска. Он передается без преобразования, только когда применяется в текущем режиме. Учитывайте его один раз вместе с условиями режима.

sort.orderBy

Поле активной сортировки. sort.orderAsc передается, только если направление известно.

groupBy

Поле группировки, если оно доступно для примененного режима.

tree

Признак древовидного представления, если он доступен для примененного режима.

Для 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 на них не распространяется.