I campi personalizzati non vengono inseriti con il nuovo editor ProseMirror

Ciao!

Abbiamo un problema con i tag personalizzati degli eventi e il nuovo editor WYSIWYG ProseMirror: i campi personalizzati compilati dal modulo dell’evento non sono presenti nella stringa generata. Funziona ancora come prima con l’editor markdown.

Passaggi per riprodurre:

  1. Abilita il plugin Discourse Calendar
  2. Aggiungi un campo personalizzato nella configurazione del plugin
  3. Apri un modulo per un nuovo Post
  4. Seleziona l’editor ProseMirror
  5. Crea un evento con un valore per il campo personalizzato (Opzioni > Crea Evento)
  6. Valida l’evento
  7. Passa all’editor Markdown

Cosa sta succedendo

Il campo personalizzato è assente dal tag [event].

Cosa è previsto

Il campo personalizzato dovrebbe essere presente nel tag [event].

Note

Quando si esegue la stessa operazione ma iniziando con l’editor Markdown invece di ProseMirror, il campo personalizzato è presente nel tag [event].

2 Mi Piace

Ho indagato un po’ su cosa stesse succedendo con toolbarEvent durante la convalida del nuovo evento: il metodo addText() sembra ricevere in entrambi i casi il markup corretto:

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

Se isso puder ajudar, aqui está o teste QUnit para reproduzir o problema:

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

Certo, rimuovi questa riga nel test coopaname_integration_enabled: false, :upside_down_face:

Non riesco a trovare un altro plugin con la stessa funzionalità, quindi è difficile capire cosa c’è che non va.

Durante la convalida del modulo, chiama this.args.model.toolbarEvent.addText() con il testo corretto.

Alcuni console.log™ mi portano a: text-manipulation.js#addText() dove viene chiamata this.convertFromMarkdown(text). Sembra che il problema provenga da qui: c’è una sorta di schema imposto, e non contiene i campi personalizzati.

Sto ancora scavando :shovel:

Il problema proviene dall’estensione dell’editor discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js: l’elenco degli attributi utilizzati da convertFromMarkdown() è definito nella costante EVENT_ATTRIBUTES. Funziona quando si aggiunge il campo personalizzato all’elenco.

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

Non c’è nulla riguardo ai campi personalizzati in questo file; non ho idea di come completare questa costante con tutti i campi personalizzati; l’estensione sembra essere registrata presto nel processo.

Qualsiasi idea è benvenuta, rende il plugin inutilizzabile con il nuovo editor che non può essere disabilitato, quindi siamo bloccati con Discourse 3.4.

I campi personalizzati non sono attualmente supportati nell’editor avanzato per ora. Indagheremo sul miglior percorso da seguire.

Può esserlo: se sei un amministratore, puoi impostare SiteSettings.rich_editor = false tramite la console, che è ancora disponibile come ultima risorsa in casi come questo.

1 Mi Piace

Grazie per la tua risposta, disabiliteremo l’editor per ora.