再現を試みます。
カレンダーページが読み込まれた後に JavaScript を実行するにはどうすればよいですか?
編集:私のケースについて説明します。
イベントを多色で表示するよう求められました。例えば:
プラグインのフォークを作成したくはないため、以下のコードで実現しました。
色はイベントタグに関連付けられ、デフォルトのカテゴリ色を置き換えます。
タグリストをイベントの HTML に以下のように追加しました:data-tags="{{event.topic.tags}}"
<script type="text/x-handlebars" data-template-name="javascripts/components/events-calendar-event">
<div class="{{event.classes}}" data-tags="{{event.topic.tags}}" {{action 'selectEvent' event.topic.url}} style="{{event.listStyle}}">
{{#unless event.allDay}}
<span style='{{event.dotStyle}}'>{{d-icon 'circle'}}</span>
{{/unless}}
{{#if event.time}}
<span class="time">{{event.time}}</span>
{{/if}}
{{#if event.title}}
<span class="title" style="{{event.titleStyle}}">{{replace-emoji event.title}}</span>
{{/if}}
</div>
{{#if showEventCard}}
{{events-calendar-card topic=event.topic selectEvent="selectEvent"}}
{{/if}}
</script>
ストリップパターンを生成します:
<script type="text/discourse-plugin" version="0.8.23">
api.onPageChange((url, title) => {
// タグの色
let colors = {muni: "#91D0B5", road: "#8ABBE2", freestyle: "#CFB3D3"};
let events = document.getElementsByClassName("event");
for (var i = 0; i < events.length; i++) {
let event = events[i];
let gradient = "";
let tags = event.getAttribute("data-tags").split(",");
for (j = 1; j <= tags.length; j++) {
gradient +=
", " +
colors[tags[j - 1]] +
" " +
j * 8 +
"px, " +
colors[tags[j - 1]] +
" " +
(j * 8 + 8) +
"px";
}
event.style.background = "repeating-linear-gradient(-45deg" + gradient + ")";
}
});
</script>
さらに、少し CSS を追加しました。
結果:
タグが2つのイベント:
タグが3つのイベント:
問題点は、私の JavaScript がページ切り替え時に実行されるため、カレンダーが動的にコンテンツを読み込む場合、前月や翌月のイベントにはストリップ色が適用されないことです。
10月にいて「次へ」を2回クリックして12月に行くと、以下のように表示されます:
そのため、カレンダーのコンテンツが読み込まれた時点で JavaScript が実行されるようにしたいのです。
別の方法を試して、/assets/javascripts/discourse/lib/date-utilities.js.es6 内の eventsForDay 関数を編集することでストライプ効果を実現しました。
この行を置き換えました:
let tStyle = `width:calc((100%*${daysInRow}) - ${buffer}px);background-color:#${topic.category.color};`;
以下のように変更:
let tStyle = `width:calc((100%*${daysInRow}) - ${buffer}px);`;
そして、以下を追加しました:
if (topic.tags.length > 0) {
let colors = {muni: "#91D0B5", road: "#8ABBE2", freestyle: "#CFB3D3"};
let gradient = "";
for (let i = 1; i <= topic.tags.length; i++) {
gradient +=
", " +
colors[topic.tags[i - 1]] +
" " +
i * 8 +
"px, " +
colors[topic.tags[i - 1]] +
" " +
(i * 8 + 8) +
"px";
}
attrs['listStyle'] += `background:repeating-linear-gradient(-45deg ${gradient});`;
}
非常にうまく動作し、目的を達成するためのよりクリーンな方法です。ただし、プラグインのフォークを作成せずにこの関数やファイルをオーバーライドする方法がわかりません…
プラグインが最新の Discourse バージョンと互換性がないようです。
再構築ログファイルより:
1: from /var/www/discourse/lib/plugin/instance.rb:417:in block in notify_after_initialize' /var/www/discourse/plugins/discourse-events/plugin.rb:190:in block in activate!': uninitialized constant #Class:0x0000562a2a10fa90::SCOPES
Did you mean? Sprockets (NameError)
** 互換性のないプラグイン **
プラグインにエラーがあるため、Discourse をビルドできません。
/var/www/discourse/plugins/discourse-events
このプラグインを削除して、再度ビルドし直してください!
どうやら問題はプラグインではなく、Discourse側にあったようです。
Discourseの最新のベータ版では、少なくともプラグインは再び動作するようになりました。
最新の安定版 Discourse を現在の events プラグインで再ビルドすることは現時点では不可能であることを確認しました。![]()
残念ながら tests-passed への切り替えはできません。安定版ブランチを選んだのは、まさにこうした問題を避けるためです。誰かこの件を調査してくださっていますか?
以前は動作していた v2.5.2 で再ビルドを試みましたが、同じエラーで失敗しました。問題の所在がはっきりしません。コンテナを指し示すために、特定のコミット(プラグインのそれか、安定版 Discourse のそれ)はありますか?
当社のサポート方針は、discourse_docker のデフォルト設定であるため、最新の tests-passed バージョンとの互換性を保証することです。ただし、Pavilion ファミリのプラグインを利用しているユーザーのうち、discourse の stable ブランチを利用している方がどの程度いるか把握したいと考えています。
また、近い将来、Discourse チームが提供するイベントプラグインに移行するため、当社のイベントプラグインの廃止を予定しています。
Discourse の将来との互換性を保つために開発者が先を見据える必要があることは理解しています。それはもっともです。しかし、プラグインに何らかの安定版ブランチが存在しない場合、ベータ版を利用していないにもかかわらず設定が壊れるという状況で、安定した環境を求めている人々を放置することになります。
\u003cstrike\u003e互換性を損なったコミットについて何か情報があれば教えてください。それに基づいて対応を試みたいのですが、どの変更が原因なのか見当がつきません。\u003c/strike\u003e
追記:この問題で困っている方への一時的な回避策として、このコミット が原因のようです。
webcal API キーに関する問題が発生していましたが、解決されました。
ご報告ありがとうございます @md-misko
またしても、このプラグインは最新の Discourse リリース 2.6.0.beta5 (2bb7676ba4) と互換性がないようです。
今回は、サイトにアクセスすると空白のページが表示されるだけで、前回とは異なり admin/upgrade を使用してもエラーは発生しませんでした。
プラグインを無効化し、コンテナを再構築したところ、Discourse は再び正常に動作しています。
こんにちは、この Events プラグインは、こちらのページのように投稿の上部に「カレンダーに追加」リンクを生成しますか?
https://community.namati.org/t/asia-pacific-justice-for-all-webinar-series/78084
また、2021 年現在、この Pavilion Events プラグインと公式の Calendar プラグインを比較して、皆様はどうお考えですか?
主に、トピックをカレンダー上で集約して表示しやすくする方法に関心があり、さらにユーザーが個別のイベントを自身の Google カレンダーや.ics カレンダーに追加できる機能も欲しいと考えています。
よろしくお願いいたします。
こんにちは、
OP でも触れていますが、
どうか、Discourse チームが開発した新しい Discourse Calendar プラグインのイベント機能 があなたに適しているかどうか、少しお時間を取ってご検討ください。もしその機能で要件を満たせる場合は、そちらのプラグインを使用することを推奨します。このプラグインを使用するのは、Discourse Calendar をまず検討した上で、それでも要件を満たせない場合に限られます。
可能であれば、Discourse Calendar プラグインの使用をお勧めします。このプラグインは、Discourse Calendar では対応できない特定のユースケースのみをサポートしています。幸いなことに、ご指摘の機能は両方とも Calendar プラグインに含まれています。
はい、それがこのプラグインの機能です。ただし前述の通り、Discourse Calendar を使うべき明確なユースケースをお持ちのようですので、そちらの使用をお勧めします。
社内の運用では、メンバー向けのイベント管理にこのプラグインではなく、Discourse Calendar プラグインを使用しています。一部のクライアント向けに特定のユースケースをサポートしていますが、もし他に具体的なユースケースがあれば受け付けています。それ以外についてはサポート対象外となります。
アンガス、ありがとう。そのアドバイスはすべて読みました。あなたが問題の「Legal Empowerment Network」コミュニティの立ち上げに関わっているように見えたので、特にあなたに尋ねていました。その仕組みがとても気に入っていたからです。でも、公式のカレンダープラグインを勧めてくれて光栄です。それを調べてみます。
公式の Discourse Calendar プラグインには、トピック一覧にある「アジェンダ」フィルターのような機能はないとおっしゃってよろしいでしょうか?トピック内のイベント日付でトピック一覧をソートすることは、私が特に興味を持っている主要なユースケースの一つです。これはイベントというよりも、プロジェクト管理(トピックをタスクとして扱い、それに応じてスケジュールを設定する)の目的で使いたいと考えています。
こんなものも追加しようかと思っています。何か解決策は見つかりましたか?
私の考えは以下の通りです。各イベントは、トピックをピン留めするように「返信」として扱うべきです。「イベントを追加」ボタンをドロップダウンメニューに変更し、そのトピック内のすべてのイベントを一覧表示するようにします。
確認して、改めてご連絡します。
このプラグインの新しい機能開発は行っていません。discourse-calendar プラグインの公式イベント機能に置き換えるため、非推奨となりました。
公式プラグインには、まだアジェンダ形式のトピック一覧はないと思います。
Pavilion に以前含まれていたコンテンツが、新しいリンクへ移動したかご存知の方はいらっしゃいますか?
このプラグインが制限付きカテゴリで実行されている場合、以下が表示されます:
…しかし、ドキュメント のリンクが壊れており、404 エラーを発生させています。対象のサイトやここでも探してみましたが、このユーザー向け説明が別の場所に移動したかどうかは分かりませんでした。
そのトピックが誤って閉鎖カテゴリに移動してしまったようです。公開カテゴリに戻す必要があります。検討の上、改めてご連絡いたします。
追伸:
ページは現在、元通り復元されています。




