Masquer certains paramètres de groupe si le nom du groupe inclut un nom spécifique

J’ai créé un plugin personnalisé pour inclure des champs supplémentaires pour les groupes. Mais ils ne s’appliquent qu’aux groupes dont le nom contient « chapter ». Il n’est donc pas logique de les avoir dans des groupes à d’autres fins. Existe-t-il un moyen de créer une condition qui vérifie par exemple if chapter in group.name; then chapter = true ?

J’ai ceci :

Je veux masquer le groupe de contrôle en haut si le nom du groupe ne contient pas le mot chapter. J’utilise déjà apparemment du Jinja2 d’après l’exemple que j’ai utilisé. Si cela ressemble à d’autres Jinja2, je peux certainement y créer une condition. Mais j’ai alors besoin de savoir quelques choses.

  • Si Jinja2 est entièrement disponible, comment puis-je accéder à la variable du nom du groupe pour créer la condition ?
  • Si Jinja2 n’est pas (entièrement) disponible, comment puis-je créer cette condition alors ? Probablement qu’un autre JavaScript devrait définir un booléen, je suppose. Mais la structure de ces variables de groupe et la logique JavaScript ne me sont pas connues, tout exemple serait excellent !

Oh attendez… Je vois soudainement quelques méthodes pour tester. Si Jinja2 fonctionne ici, alors en effet dans g.json le nom du groupe est visible et peut être utilisé pour une condition…

Et non, ça ne fonctionne pas. Et ce n’est pas Jinja2, ce sont des éléments spécifiques à Handlebars (mais je suppose que contains n’est pas une fonction native ?).

{{#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}}

Mais ça ne fonctionne pas, j’obtiens un tas d’erreurs. Je n’utilise probablement pas le bon accès aux variables. Bien que remplacer group.name par simplement "chapter_netherlands" échoue également.

Erreur survenue :

- Lors du rendu :
  -niveau supérieur
    application
      discourse-root
        groupe
          groupe.gestion
            groupe.gestion.profil
              champs-profil-formulaire-groupes
                prise-de-raccordement-plugin
                  connecteur-plugin

Erreur non interceptée : Tentative de résolution de `contains`, qui était attendu comme un composant, mais rien n'a été trouvé.

Quelqu’un peut-il m’indiquer la bonne direction, s’il vous plaît ? :nerd_face:

Je comprends et j’admets que je dois créer ces fonctions moi-même, ce n’est pas comme Jinja2 avec des choses intégrées utiles pour faire cela.

Mais où dois-je créer ces fonctions handlebars dans mon plugin ? Je vois pas mal d’exemples ici : Repository search results · GitHub

Mais je ne vois pas vraiment de schéma dans cette structure de dossiers. J’ai créé ma propre fonction dans discourse-group-custom-fields/assets/javascripts/discourse/app/helpers/contains.js, mais quand j’essaie de l’utiliser dans discourse-group-custom-fields/assets/javascripts/discourse/connectors/group-edit/field-container.hbs, j’obtiens l’erreur Uncaught Error: Attempted to resolve "contains", which was expected to be a component, but nothing was found.. Donc, évidemment, ce n’est pas un chemin que Discourse recherche, ou je fais quelque chose de mal.

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);
});

Le sujet ci-dessous suggère que cela pourrait être dans le répertoire des initializers et avoir l’extension es6.

J’ai donc déplacé mon fichier contains.js dans ce répertoire et ajouté .e6 comme extension, et j’ai obtenu la même erreur. Une aide ou de la documentation serait formidable :slight_smile: