イベント追加: トピックフィルタのクエリ言語にフィルタを追加(Discourse Eventsプラグイン拡張)

:information_source: これにより、Events プラグイン経由でイベントが関連付けられたトピックを、/filter ルートと Custom Topic Lists プラグインを使用してフィルタリングできるようになります。

問題点

Discourse Events プラグイン は豊富な情報を含むイベントトピックを作成しますが、現在では トピックフィルタクエリ言語 を使用して、それらを非イベントトピックから分離する方法がありません。

既存の回避策にはすべて欠点があります:

  • /upcoming-events ルートはカレンダー形式でイベントを表示しますが、フィルタリング可能なトピックリストではありません — ただし本来そうであるべきかもしれません!!!
  • カスタムリスト上のイベントカレンダー テーマコンポーネントにはクライアントサイドで「イベントのあるトピックのみ表示」する設定がありますが、これはリスト読み込み後に動作します。真のサーバーサイドフィルタではなく、ページネーションとの相性が悪く、動作が不整合になる場合があります。
  • 規約ベースのアプローチ(専用カテゴリ、必須タグ)は、厳格なコンテンツ管理規律を必要とします。

提案される解決策

Events プラグインは、Solved プラグイン (status:solved / status:unsolved) や Assign プラグイン (?assigned=username) で既に使用されているパターンに従い、トピックフィルタ DSL に event: フィルタを追加すべきです。

構文例:

event:yes                          # イベントが関連付けられたトピック
event:no                           # イベントのないトピック (-event:yes を通じて)
-category:announcements event:yes  # announcements 以外でのイベント
tag:meetup event:yes order:created # イベントを持つ meetup タグ付きトピック、作成日順ソート

既存の status: ネームスペースとの一貫性のために status:events バリアントも検討できますが、主要ユースケースに対しては event: の方がより自然に読めます。

なぜこれが適切なレイヤーなのか

フィルタのドキュメントには明確に記載されています:

Events プラグインは既に、専用のテーブルに構造化されたイベントデータ(開始日、終了日、ステータス、RSVP)を保存しています。サーバーサイドフィルタはこれを効率的にクエリできますが、クライアントサイドコンポーネントでは単に不可能です。

ユースケース例

コミュニティマネージャーとして、私は共有可能な URL(サイドバーにリンク可能、Custom Topic Lists 経由で埋め込み可能、Filtered Topic Lists テーマコンポーネントで使用可能)が必要で、イベントが関連付けられたすべてのカテゴリ内のすべてのトピックを確実に、イベント日付順に表示させたいです。

現在、私は確信を持ってそのクエリを構築できません。event: フィルタがあれば、以下のようにできます:

event:yes order:created

…そして、サイト内のすべてのイベントを含む、クリーンでページネーション対応、権限認識型のトピックリストを取得できます。


関連トピック

「いいね!」 3

いいアイデアですね!以下のようにするのはどうでしょう:

  • event:any イベントがあるトピック
  • -event:any イベントがないトピック
  • event:upcoming まだ開始していないイベント
  • event:ongoing 現在開催中のイベント
  • event:past 終了したイベント(クローズ済みのイベントを含む)
  • event:upcoming,ongoing カンマは「いずれか」を意味します
  • -event:<state> その状態のイベントを持つトピックを除外します(例:-event:past)
  • event-after:YYYY-MM-DD 指定日付以降に開始するイベント
  • event-before:YYYY-MM-DD 指定日付以前に開始するイベント
  • event-attending:<username> そのユーザーが参加予定のイベント
  • event-attending:me あなたが参加予定のイベント
  • order:event-start イベント開始順で並べ替え、最新のものから表示
  • order:event-start-asc イベント開始順で並べ替え、最も近いものから表示
「いいね!」 4