特定の名前が含まれるグループ名を非表示にするグループ設定

グループにいくつかの追加フィールドを含めるためにカスタムプラグインを作成しましたが、それらは「chapter」という名前のグループにのみ適用されます。そのため、他の目的のグループに含める意味がありません。たとえば、if chapter in group.name; then chapter = true のような条件を作成する方法はありますか?

以下は私のコードです。

グループ名に「chapter」という単語が含まれていない場合に、上部にあるコントロールグループを非表示にしたいです。すでに例で使用したJinja2の一部を使用しているようです。それが他のJinja2と同様であれば、そこで条件を作成できます。しかし、そのためにはいくつかのことを知る必要があります。

  • Jinja2が完全に利用可能であれば、条件を作成するためにグループ名変数にどのようにアクセスできますか?
  • Jinja2が(完全に)利用可能でない場合は、どのようにこの条件を作成できますか?おそらく、JavaScriptでブール値を設定する必要があるでしょう。しかし、これらのグループ変数とJavaScriptロジックの構造は私にはわかりません。例があれば幸いです!

ああ、待ってください…テストできる方法がいくつか見えてきました。Jinja2がここで機能するなら、確かにg.jsonでグループ名が表示され、条件として使用できます…

いや、それはうまくいきません。そしてJinja2ではなく、Handlebars固有のものです(ただし、containsはネイティブ関数ではないと思いますか?)。

{{#contains "chapter" group.name}}
<div class='control-group'>
    <label class="control-label">{{i18n 'admin.groups.my_map.map_title'}}</label>
    {{input type="checkbox" checked=group.custom_fields.show_map}}
    <span>{{i18n 'admin.groups.my_map.map_switch'}}</span>
</div>
{{/contains}}

しかし、それはうまくいかず、たくさんのエラーが発生します。おそらく正しい変数参照を使用していません。group.nameを単純な"chapter_netherlands"に置き換えても失敗します。

エラーが発生しました:

- レンダリング中:
  -トップレベル
    アプリケーション
      discourse-root
        グループ
          group.manage
            group.manage.profile
              groups-form-profile-fields
                plugin-outlet
                  plugin-connector

未キャッチエラー:コンポーネントとして期待されていた`contains`を解決しようとしましたが、何も見つかりませんでした。

どなたか正しい方向を教えていただけますか? :nerd_face:

承知いたしました。これらの関数を自分で作成する必要があることは理解していますが、これはJinja2のように便利な組み込み機能があるわけではありません。

では、これらのHandlebars関数はプラグインのどこで作成すればよいのでしょうか?こちらで多くの例を見つけました: Repository search results · GitHub

しかし、このフォルダ構造には明確なパターンが見られません。discourse-group-custom-fields/assets/javascripts/discourse/app/helpers/contains.js に独自の関数を作成しましたが、discourse-group-custom-fields/assets/javascripts/discourse/connectors/group-edit/field-container.hbs で使用しようとすると、Uncaught Error: Attempted to resolve "contains", which was expected to be a component, but nothing was found. というエラーが発生します。明らかに、これはDiscourseが探しているパスではないか、あるいは何か間違っているのでしょう。

import RawHandlebars from "discourse-common/lib/raw-handlebars";
import { htmlSafe } from "@ember/template";
import { rawConnectorsFor } from "discourse/lib/plugin-connectors";

//RawHandlebars.registerHelper("contains", function (args) {
//  const connectors = rawConnectorsFor(args.hash.name);
//  if (connectors.length) {
//    const output = connectors.map((c) => c.template({ context: this }));
//    return htmlSafe(output.join(""));
//  }
//});


Handlebars.registerHelper('contains', function(needle, haystack, options) {
     needle = Handlebars.escapeExpression(needle);
     haystack = Handlebars.escapeExpression(haystack);
     return (haystack.indexOf(needle) > -1) ? options.fn(this) : options.inverse(this);
});

以下のトピックでは、イニシャライザディレクトリにes6拡張子で配置することが考えられると示唆されています。

そこで、contains.js をそのディレクトリに移動し、拡張子を .e6 にしましたが、同じエラーが発生しました。何か助言やドキュメントがあれば幸いです :slight_smile: