Добавить событие: фильтр в язык запросов фильтра тем (расширение плагина Discourse Events)

:information_source: Это позволит фильтровать темы, к которым привязано событие через плагин Events, используя маршрут /filter и плагин Custom Topic Lists.

Проблема

Плагин Discourse Events создает насыщенные тематические страницы событий, но в настоящее время нет способа изолировать их от обычных тем с помощью языка запросов фильтрации тем.

Все существующие обходные решения имеют недостатки:

  • Маршрут /upcoming-events отображает события в виде календаря, а не как фильтруемый список тем — хотя, возможно, он должен это делать!!!
  • Компонент темы Календарь событий на пользовательских списках имеет настройку «Показывать только темы со событиями» на стороне клиента, но она работает после загрузки списка — это не настоящий серверный фильтр, он плохо работает с пагинацией и может вести себя непоследовательно.
  • Подходы, основанные на соглашениях (выделенные категории, обязательные теги), требуют строгой дисциплины в управлении контентом.

Предлагаемое решение

Плагин Events должен расширить DSL фильтрации тем добавлением фильтра event:, следуя тому же паттерну, который уже используется в плагине Solved (status:solved / status:unsolved) и плагине Assign (?assigned=username).

Пример синтаксиса:

event:yes                          # Темы, к которым привязано событие
event:no                           # Темы без событий (через -event:yes)
-category:announcements event:yes  # События вне раздела объявлений
tag:meetup event:yes order:created # Темированные встречи с событиями, отсортированные по новизне

Также можно рассмотреть вариант status:events для согласованности с существующим пространством имен status:, но event: звучит более естественно для основного случая использования.

Почему этот уровень правильный

Документация по фильтрам явно указывает:

Плагин Events уже хранит структурированные данные о событиях (дата начала, дата окончания, статус, RSVP) в выделенных таблицах. Серверный фильтр может эффективно запрашивать эти данные — то, чего просто не может сделать компонент на стороне клиента.

Пример использования

Как менеджер сообщества, я хочу иметь общий URL — доступный для ссылки в боковой панели, встроенный через Custom Topic Lists и используемый в компоненте темы Фильтрованные списки тем — который надежно показывает все темы в любой категории, к которым привязано событие, отсортированные по дате события.

Сегодня я не могу уверенно составить такой запрос. С фильтром event: я смог бы:

event:yes order:created

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


Связанные темы