Benutzerdefinierte Felder werden mit dem neuen ProseMirror-Editor nicht eingefügt

Hallo!

Wir haben ein Problem mit benutzerdefinierten Event-Tags und dem neuen WYSIWYG ProseMirror-Editor: Benutzerdefinierte Felder, die aus dem Event-Formular ausgefüllt werden, sind nicht im generierten String vorhanden. Mit dem Markdown-Editor funktioniert es wie zuvor.

Schritte zur Reproduktion:

  1. Aktivieren Sie das Discourse Calendar-Plugin
  2. Fügen Sie ein benutzerdefiniertes Feld in der Plugin-Konfiguration hinzu
  3. Öffnen Sie ein Formular für einen neuen Beitrag
  4. Wählen Sie den ProseMirror-Editor
  5. Erstellen Sie ein Event mit einem Wert für das benutzerdefinierte Feld (Optionen > Event erstellen)
  6. Validieren Sie das Event
  7. Wechseln Sie zum Markdown-Editor

Was passiert

Das benutzerdefinierte Feld fehlt im [event]-Tag.

Was erwartet wird

Das benutzerdefinierte Feld sollte im [event]-Tag vorhanden sein.

Hinweise

Wenn Sie dasselbe tun, aber mit dem Markdown-Editor anstelle von ProseMirror beginnen, ist das benutzerdefinierte Feld im [event]-Tag vorhanden.

2 „Gefällt mir“

Ich habe ein wenig untersucht, was mit dem toolbarEvent passiert, wenn die neue Methode addText() validiert wird. Sie scheint in beiden Fällen das richtige Markup zu erhalten:

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

Wenn das helfen kann, hier ist der QUnit-Test, um das Problem zu reproduzieren:

// 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 - New event form with custom fields", 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("filling the form with MD editor fills the custom fields", async function (assert) {
    await ensureEventTagHasFields(assert, "md");
  });

  test("filling the form with WYSIWYG editor fills the custom fields", 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} is present in event tag`);
  });
}

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

Natürlich, entfernen Sie diese Zeile im Test coopaname_integration_enabled: false, :upside_down_face:

Ich kann kein anderes Plugin mit der gleichen Funktion finden, daher ist es schwer zu erkennen, was falsch ist.

Bei der Validierung des Formulars wird this.args.model.toolbarEvent.addText() mit dem richtigen Text aufgerufen.

Ein paar console.log(TM) führen mich zu: text-manipulation.js#addText(), wo this.convertFromMarkdown(text) aufgerufen wird. Es scheint, dass das Problem von hier kommt: Es gibt eine Art Schema, das erzwungen wird, und es enthält nicht die benutzerdefinierten Felder.

Ich grabe immer noch :shovel:

Das Problem liegt in der Editor-Erweiterung discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js: Die Liste der Attribute, die von convertFromMarkdown() verwendet werden, ist in der Konstante EVENT_ATTRIBUTES definiert. Es funktioniert, wenn das benutzerdefinierte Feld zur Liste hinzugefügt wird.

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

In dieser Datei gibt es nichts über benutzerdefinierte Felder; ich habe keine Ahnung, wie ich diese Konstante mit allen benutzerdefinierten Feldern vervollständigen soll; die Erweiterung scheint früh im Prozess registriert zu werden.

Jede Idee ist willkommen, da sie das Plugin mit dem neuen Editor, der nicht deaktiviert werden kann, unbrauchbar macht, sodass wir bei Discourse 3.4 feststecken.

Benutzerdefinierte Felder werden derzeit noch nicht für den Rich-Text-Editor unterstützt. Wir werden den besten Weg nach vorne untersuchen.

Das ist möglich – wenn Sie Administrator sind, können Sie SiteSettings.rich_editor = false über die Konsole setzen, die in solchen Fällen immer noch als letzter Ausweg zur Verfügung steht.

1 „Gefällt mir“

Danke für Ihre Antwort, wir werden den Editor vorerst deaktivieren.