Comment configurer un objet tableau dans un plugin ? Utiliser json_schema ? type: objects ?

Comment configurer des objets de tableau dans un plugin ? J’ai essayé json_schema, mais les propriétés d’objet ne prennent pas en charge les sélecteurs comme category ; seules les entrées de texte sont possibles. Quant à type: objects, cela ne fonctionne tout simplement pas dans la configuration du plugin.

Configuration de json_schema :

  quectel_online_customer_category_customers:
    default: "[]"
    client: true
    json_schema: QuectelOnlineCustomer::SiteSettings::CategoryCustomersJsonSchema

plugins/quectel-online-customer/lib/quectel_online_customer/site_settings/category_customers_json_schema.rb

# frozen_string_literal: true

module QuectelOnlineCustomer
  module SiteSettings
    class CategoryCustomersJsonSchema
      def self.schema
        @schema ||= begin
          {
            type: "array",
            uniqueItems: true,
            default: [],
            items: {
              type: "object",
              title: "Configuration des clients par catégorie",
              additionalProperties: false, # Interdit la soumission de champs non définis
              required: %w[category customers], # Les deux champs sont obligatoires
              properties: {
                category: {
                  type: "category",
                  description: "Catégorie du forum associée",
                  label: "Catégorie"
                },
                customers: {
                  type: "usernames", # Sélection multiple d'utilisateurs, remplace le nom d'utilisateur unique
                  description: "Comptes de service client attribués à cette catégorie, prend en charge la sélection multiple",
                  label: "Utilisateurs du service client"
                }
              }
            }
          }
        end
      end
    end
  end
end

type:objects devrait fonctionner dans les plugins ! Nous l’utilisons nous-mêmes ici, par exemple :

https://github.com/discourse/discourse/blob/eba9a3b69cf637fccba1a00978f2269b4fccf9d4/plugins/discourse-openid-connect/config/settings.yml#L59-L71

Oui, c’est tout à fait possible. Cependant, type:objects ne prend pas non plus en charge type:category. Mon besoin est de pouvoir sélectionner à la fois des catégories et des groupes.

Ah je vois, donc les paramètres de l’objet sont ajoutés directement dans votre settings.yml. Vous voudriez le formater comme ceci :

oauth2_category_example:
    type: objects
    default: []
    area: "oauth2"
    schema:
      name: category_rule
      identifier: name
      properties:
        name:
          type: string
          required: true
          label: Nom de la règle
          description: Une étiquette pour cette règle
        category:
          type: categories
          required: true
          label: Catégorie
          description: La catégorie à laquelle cette règle s'applique
          validations:
            max: 1
        groups:
          type: groups
          label: Groupes
          description: Groupes associés à cette catégorie

Ce qui produirait un menu déroulant de catégories comme celui-ci

Le type type:category en choix unique n’est-il pas pris en charge ?

Selon cette configuration

quectel_online_customer_category_customer_group:
    type: objects
    default: []
    schema:
      name: « Groupe de catégories de service client »
      identifier: name
      properties:
        name:
          type: string
          required: true
          label: Nom
          description: Nom
        category:
          type: categories
          required: true
          label: « Catégorie »
          description: « Nom de la catégorie, veuillez consulter la page <a href=\"/categories\" target=\"_blank\">Toutes les catégories</a> »
        group_name:
          type: groups
          required: true
          label: « Nom du groupe de service client »
          description: « Nom du groupe de service client, caractères anglais, veuillez consulter la page <a href=\"/admin/groups\" target=\"_blank\">Groupes de service client</a> »

Je rencontre l’erreur suivante :

Une erreur s'est produite :

- Lors du rendu :
  {{outlet}} pour -top-level
    -top-level
      {{outlet}} pour application
        application
          DiscourseRoot
            {{outlet}} pour admin
              admin
                {{outlet}} pour admin.schema
                  schema
                    SchemaSettingNewEditor
                      SchemaSettingField
                        SchemaSettingTypeCategories
                          CategorySelector

section-link.gjs:149
 Tentative de nouveau rendu, mais l'application Ember a rencontré une erreur irrécupérable pendant le rendu. Vous devez recharger l'application après avoir corrigé la cause de l'erreur.
categories.gjs:13
 Uncaught (in promise) TypeError: this.args.value?.map n'est pas une fonction
    at SchemaSettingTypeCategories.<anonymous> (categories.gjs:13:9)

Est-ce lié à ma version ?

Discourse v2026.1.4 — Commits · discourse/discourse · GitHub — Ember v6.6.0

Avez-vous une configuration obsolète enregistrée dans les paramètres ? Pourriez-vous essayer de la réinitialiser aux valeurs par défaut en utilisant le bouton de réinitialisation s’il apparaît ?

Je ne vois pas le bouton de réinitialisation. La page ressemble exactement à la capture d’écran, et les éléments sous la catégorie ne s’affichent pas.

Hmmm, je ne suis pas sûr de ce qui pourrait poser problème là-bas… J’ai testé l’option des catégories avec le type d’objets, donc je sais que ça fonctionne, et ça ne devrait pas venir de ta version. Je me demande toujours si quelque chose est coincé dans un état incorrect quelque part ; tu pourrais essayer un paramètre séparé avec un nouveau nom juste pour tester ? Est-ce que c’est sur GitHub ou quelque part ailleurs, pour que je puisse essayer ?

type:categories est acceptable, mais type:category ne l’est pas.

Cependant, la configuration ci-dessous fonctionne également bien pour le cas où une seule option est sélectionnée, ce qui rend type:category inutile.

category:
  type: categories
  required: true
  label: « Catégorie »
  description: « Nom de la catégorie »
  validations:
	max: 1