Nascondi determinate impostazioni di gruppo se il nome del gruppo include un nome specifico

Ho creato un plugin personalizzato per includere alcuni campi aggiuntivi per i gruppi. Ma si applicano solo ai gruppi con il nome “chapter” al loro interno. Quindi non ha senso averli nei gruppi per altri scopi. C’è un modo per creare una condizione che controlli, ad esempio, if chapter in group.name; then chapter = true?

Ho il seguente:

Voglio nascondere il gruppo di controllo in alto se il nome del gruppo non contiene la parola chapter. Sembra che io stia già usando del Jinja2 dall’esempio che ho usato. Se è simile ad altri Jinja2, allora posso certamente creare una condizione lì. Ma poi ho bisogno di sapere alcune cose.

  • Se Jinja2 è completamente disponibile, come posso accedere alla variabile del nome del gruppo per creare la condizione?
  • Se Jinja2 non è (completamente) disponibile, come posso creare questa condizione allora? Probabilmente qualcos’altro in JavaScript dovrebbe impostare un booleano, suppongo. Ma la struttura di queste variabili di gruppo e la logica JavaScript non mi sono note, qualsiasi esempio sarebbe fantastico!

Oh aspetta… ora vedo improvvisamente alcuni metodi per testare. Se Jinja2 funziona qui, allora effettivamente in g.json il nome del gruppo è visibile e può essere utilizzato per una condizione…

E no, non funziona. E non è Jinja2, sono cose specifiche di Handlebars (ma suppongo che contains non sia una funzione nativa?).

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

Ma non funziona, ottengo un sacco di errori. Probabilmente non sto usando la corretta ricerca della variabile. Anche se sostituire group.name con semplicemente "chapter_netherlands" fallisce comunque.

Si è verificato un errore:

- Durante il rendering:
  -top-level
    application
      discourse-root
        group
          group.manage
            group.manage.profile
              groups-form-profile-fields
                plugin-outlet
                  plugin-connector

Errore irreversibile: Tentativo di risolvere `contains`, che ci si aspettava fosse un componente, ma non è stato trovato nulla.

Qualcuno può indicarmi la giusta direzione, per favore? :nerd_face:

Capisco e accetto che devo creare queste funzioni da solo, non è come Jinja2 con utili cose integrate per farlo.

Ma dove creo queste funzioni handlebars nel mio plugin? Vedo parecchi esempi qui: Repository search results · GitHub

Ma non vedo davvero uno schema in questa struttura di cartelle. Ho creato la mia funzione in discourse-group-custom-fields/assets/javascripts/discourse/app/helpers/contains.js, ma quando provo a usarla in discourse-group-custom-fields/assets/javascripts/discourse/connectors/group-edit/field-container.hbs ottengo l’errore Uncaught Error: Attempted to resolve "contains", which was expected to be a component, but nothing was found.. Quindi, ovviamente, questo non è un percorso in cui Discourse sta cercando, o sto facendo qualcosa di sbagliato.

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

L’argomento sottostante suggerisce che potrebbe trovarsi nella directory degli initializers e avere l’estensione .es6.

Quindi ho spostato il mio contains.js in quella directory e ho aggiunto .es6 come estensione e ho ottenuto lo stesso errore. Qualsiasi aiuto o documentazione sarebbe molto apprezzato :slight_smile: