Los campos personalizados no se insertan con el nuevo editor ProseMirror

Hola!

Tenemos un problema con las etiquetas personalizadas de eventos y el nuevo editor WYSIWYG ProseMirror: los campos personalizados rellenados desde el formulario del evento no están presentes en la cadena generada. Todavía funciona como antes con el editor markdown.

Pasos para reproducir:

  1. Habilita el plugin Discourse Calendar
  2. Añade un campo personalizado en la configuración del plugin
  3. Abre un formulario para una nueva Publicación
  4. Selecciona el editor ProseMirror
  5. Crea un evento con un valor para el campo personalizado (Opciones > Crear Evento)
  6. Valida el evento
  7. Cambia al editor Markdown

Qué está sucediendo

El campo personalizado está ausente de la etiqueta [event].

Qué se espera

El campo personalizado debería estar presente en la etiqueta [event].

Notas

Al hacer lo mismo pero comenzando con el editor Markdown en lugar de ProseMirror, el campo personalizado está presente en la etiqueta [event].

2 Me gusta

Investigué un poco lo que sucedía con el toolbarEvent al validar el nuevo evento: el método addText() parece recibir en ambos casos el marcado correcto:

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

Si eso puede ayudar, aquí está la prueba QUnit para reproducir el 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);
  }
}

Por supuesto, elimina esta línea en la prueba coopaname_integration_enabled: false, :upside_down_face:

No puedo encontrar otro plugin con la misma característica, así que es difícil encontrar qué está mal.

Al validar el formulario, llama a this.args.model.toolbarEvent.addText() con el texto correcto.

Varios console.log(TM) me llevan a: text-manipulation.js#addText() donde se llama a this.convertFromMarkdown(text). Parece que el problema viene de aquí: hay un tipo de esquema que se aplica y no contiene los campos personalizados.

Todavía sigo investigando :shovel:

El problema proviene de la extensión del editor discourse-calendar/assets/javascripts/discourse/pre-initializers/rich-editor-extension.js: la lista de atributos utilizada por convertFromMarkdown() se define en la constante EVENT_ATTRIBUTES. Funciona al agregar el campo personalizado a la lista.

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

No hay nada sobre campos personalizados en este archivo; no tengo idea de cómo completar esta constante con todos los campos personalizados; la extensión parece registrarse temprano en el proceso.

Se aceptan ideas, hace que el plugin no sea utilizable con el nuevo editor que no se puede deshabilitar, por lo que estamos atascados con Discourse 3.4.

Los campos personalizados no son compatibles en el editor enriquecido por ahora. Investigaremos el mejor camino a seguir.

Sí se puede: si eres administrador, puedes establecer SiteSettings.rich_editor = false a través de la consola, que todavía está disponible como último recurso en casos como este.

1 me gusta

Gracias por tu respuesta, deshabilitaremos el editor por ahora.