Les champs personnalisés ne sont pas insérés avec le nouvel éditeur ProseMirror

Bonjour !

Nous avons un problème avec les balises personnalisées d’événements et le nouvel éditeur ProseMirror WYSIWYG : les champs personnalisés remplis à partir du formulaire d’événement ne sont pas présents dans la chaîne générée. Cela fonctionne toujours comme avant avec l’éditeur Markdown.

Étapes pour reproduire :

  1. Activer le plugin Discourse Calendar
  2. Ajouter un champ personnalisé dans la configuration du plugin
  3. Ouvrir un formulaire pour un nouveau message
  4. Sélectionner l’éditeur ProseMirror
  5. Créer un événement avec une valeur pour le champ personnalisé (Options > Créer un événement)
  6. Valider l’événement
  7. Basculer vers l’éditeur Markdown

Ce qui se passe

Le champ personnalisé est absent de la balise [event].

Ce qui est attendu

Le champ personnalisé doit être présent dans la balise [event].

Notes

Lorsque l’on fait la même chose mais en commençant par l’éditeur Markdown au lieu de ProseMirror, le champ personnalisé est présent dans la balise [event].

2 « J'aime »

J’ai un peu enquêté sur ce qui se passait avec toolbarEvent lors de la validation du nouvel événement : la méthode addText() semble recevoir dans les deux cas le bon balisage :

[event start="2025-09-26 18:00" status="public" timezone="Europe/Paris" end="2025-09-26 19:00" cf_1="abcd"]\n[/event]

Si cela peut aider, voici le test QUnit pour reproduire le problème :

// plugins/discourse-calendar/test/acceptance/post-event-builder-custom-tags-test.js
import { click, find, visit, fillIn } from "@ember/test-helpers";
import { test } from "qunit";
import { acceptance } from "discourse/tests/helpers/qunit-helpers";
import selectKit from "discourse/tests/helpers/select-kit-helper";
import { i18n } from "discourse-i18n";

acceptance("Discourse Calendar - Nouveau formulaire d'événement avec champs personnalisés", function (needs) {
  needs.user({ admin: true, can_create_discourse_post_event: true });
  needs.settings({
    discourse_local_dates_enabled: true,
    calendar_enabled: true,
    discourse_post_event_enabled: true,
    discourse_post_event_allowed_on_groups: "",
    discourse_post_event_allowed_custom_fields: "my_custom_field",
    coopaname_integration_enabled: false,
  });

  test("remplir le formulaire avec l'éditeur MD remplit les champs personnalisés", async function (assert) {
    await ensureEventTagHasFields(assert, 'md');
  });

  test("remplir le formulaire avec l'éditeur WYSIWYG remplit les champs personnalisés", async function (assert) {
    await ensureEventTagHasFields(assert, 'wysiwyg');
  });
});

async function ensureEventTagHasFields(assert, editorType){
  await visit("/");
  await click('#create-topic');
  const categoryChooser = selectKit(".category-chooser");
  await categoryChooser.expand();
  await categoryChooser.selectRowByValue(2);

  await switchEditorTo(editorType);

  await click(".toolbar-menu__options-trigger");
  await click(`button[title='${i18n("discourse_post_event.builder_modal.attach")}']`);
  await fillIn('input.custom-field-input', 'some value')
  await click('.d-modal__footer > button');

  await switchEditorTo('md');

  const fields = ['start', 'status', 'timezone', 'myCustomField'];
  const content = await find(".d-editor-input").value;

  fields.forEach((field) => {
    assert.true(content.includes(`${field}="`), `${field} est présent dans la balise d'événement`);
  });
}

async function switchEditorTo(type){
  const editorSwitch = find('button.composer-toggle-switch');
  const isInMarkdown = editorSwitch.attributes['aria-checked'].value === 'false';
  if (isInMarkdown && type === 'wysiwyg' || !isInMarkdown && type === 'md') {
    await click(editorSwitch);
  }
}

Bien sûr, supprimez cette ligne dans le test coopaname_integration_enabled: false, :upside_down_face:

Je ne trouve pas d’autre plugin avec la même fonctionnalité, il est donc difficile de trouver ce qui ne va pas.

Lors de la validation du formulaire, il appelle this.args.model.toolbarEvent.addText() avec le bon texte.

Quelques console.log(TM) me mènent à : text-manipulation.js#addText()this.convertFromMarkdown(text) est appelé. Il semble que le problème vienne d’ici : il y a une sorte de schéma appliqué, et il ne contient pas les champs personnalisés.

Je continue de creuser :shovel:

Le problème vient de l’extension d’éditeur discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js : la liste des attributs utilisés par convertFromMarkdown() est définie dans la constante EVENT_ATTRIBUTES. Cela fonctionne lorsque le champ personnalisé est ajouté à la liste.

const EVENT_ATTRIBUTES = {
  // ...
  chatChannelId: { default: null },
  myCustomField: {default: null}
};

Il n’y a rien concernant les champs personnalisés dans ce fichier ; je n’ai aucune idée de comment compléter cette constante avec tous les champs personnalisés ; l’extension semble être enregistrée tôt dans le processus.

Toute idée est la bienvenue, cela rend le plugin inutilisable avec le nouvel éditeur qui ne peut pas être désactivé, nous sommes donc bloqués avec Discourse 3.4.

Les champs personnalisés ne sont effectivement pas pris en charge dans l’éditeur enrichi pour l’instant. Nous allons étudier la meilleure marche à suivre.

C’est possible – si vous êtes administrateur, vous pouvez définir SiteSettings.rich_editor = false via la console, qui est toujours disponible en dernier recours dans des cas comme celui-ci.

1 « J'aime »

Merci pour votre réponse, nous allons désactiver l’éditeur pour le moment.